从Apache TDB加载数据集/模型的性能问题

时间:2015-02-09 13:57:21

标签: java jena tdb

我有一个包含7MB和~80k语句的RDF文件。

启动应用程序时,我有以下代码,它检索我需要向用户显示的itens列表:

           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");

techModel似乎立即加载,并且发布的第一个代码在不到一秒的时间内运行。

案例(2)但是,当我尝试从TDB数据库(先前加载了第一个案例中使用的相同RDF文件)加载模型时,使用以下代码:

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

techModel似乎没有立即加载,即使发布的第一个代码按预期返回,它也会在第一次调用时运行大约30秒。

如果我在第一次之后调用相同的代码,或者,例如,在第一次调用此代码之前插入另一个类似techModel.listSubjects()的操作,它将按预期立即运行。

在我看来,在第二种情况下,模型实际上只是在它遭受的第一次操作之后加载。它有意义吗?

我不想将我的数据保存在RDF文件中,而是拥有存储三元组的TDB数据库。这就是为什么第二种选择似乎更适合我。

任何人都可以帮我这个吗?我希望我能正确地揭露问题。

提前致谢。

1 个答案:

答案 0 :(得分:2)

这里有两种效果:

TDBFactory.createDataset未加载任何数据 - 它连接到数据库。数据在使用时被加载到内存中(缓存),因此当您第一次执行listObjectsOfProperty时,所有缓存都很冷,数据库可能很慢。它对你现在运行的硬件非常敏感。

第二个是Model API调用可以具有数据库不友好的访问模式。最好在数据集上使用SPARQL。

顺便说一句:listObjectsOfProperty没有主题 - 它需要一个属性并且可以访问很多数据库。如果myCollection是一个集合,那么你可能会添加超过3K项目。