Проблемы с производительностью при загрузке набора данных / модели из Apache TDB

У меня есть файл RDF, который имеет 7MB и ~ 80k операторов.

При запуске приложения у меня есть следующий код, который извлекает список итогов, которые мне нужно показать пользователю:

           NodeIterator iterator = technologyModel.listObjectsOfProperty(subject);
           while (iterator.hasNext()) {
               RDFNode node = iterator.nextNode();
               myCollection.add(node.asLiteral().getString().trim());
           }

Примечание: этот код работает просто отлично и возвращает что-то о результатах 3k, и это первый раз, когда "technologyModel" доступен.

Очевидно, что прежде чем сделать это, я должен загрузить набор данных / модель, и вот проблема.

Случай (1) Когда я загружаю набор данных / модель из файла RDF, делаю это:

    InputStream in = FileManager.get().open(ParamsHelper.sourceRDF);
    technologyModel.read(in, "RDF/XML-ABBREV");

TechnologyModel кажется мгновенно загруженным, и первый опубликованный код выполняется менее чем за секунду.

Случай (2) Однако, когда я пытаюсь загрузить модель из базы данных TDB (ранее загруженной тем же файлом RDF, который использовался в первом случае), с этим кодом:

    dataset = TDBFactory.createDataset(ParamsHelper.tdbBaseDir);
    dataset.begin(ReadWrite.READ) ;
    technologyModel = dataset.getNamedModel("http://a.example.biz/technology");
    dataset.end();

Кажется, что technologyModel загружается не сразу, и хотя первый опубликованный код возвращается, как и ожидалось, он запускается примерно через 30 секунд при первом вызове.

Если я вызову тот же код после первого раза или, например, вставлю другую операцию, такую ​​как technologyModel.listSubjects(), до первого вызова этого кода, он запустится немедленно, как и ожидалось.

Мне кажется, что во втором случае модель действительно загружается только после первой операции, от которой она страдает. Есть ли смысл?

Я не хочу хранить свои данные в файле RDF, а хочу иметь базу данных TDB, в которой хранятся триплеты. Вот почему второй вариант, кажется, подходит мне лучше.

Может ли кто-нибудь помочь мне в этом? Я надеюсь, что смог правильно разоблачить проблему.

Заранее спасибо.

1 ответ

Здесь есть два эффекта:

TDBFactory.createDataset не загружает никаких данных - он подключается к базе данных. Данные загружаются в память (кэшируются), так как они используются, когда вы делаете listObjectsOfProperty в первый раз все кэши холодные и база данных может работать медленно. Это будет очень чувствительно к оборудованию, на котором вы работаете в данный момент.

Второе - это то, что вызовы Model API могут иметь шаблоны доступа, которые непригодны для данных. Лучше использовать SPARQL для набора данных.

Кстати: listObjectsOfProperty не берет предмет - он берет свойство и может получить доступ ко многим базам данных. Если myCollection является набором, то вы можете добавлять намного больше 3K элементов.

Другие вопросы по тегам