Проблемы с производительностью при загрузке набора данных / модели из 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 элементов.