2015-02-09 43 views
0

我有一个具有7MB和〜80k语句的RDF文件。从Apache TDB加载数据集/模型的性能问题

当启动应用程序,我有以下的代码,检索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"); 

的technologyModel似乎瞬间加载和第一码贴在运行不到一秒钟。

情况(2)然而,当我尝试加载从数据库TDB(先前加载的与第一种情况下所使用的相同RDF文件)的模型,在该代码:

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

的technologyModel doesn' t似乎立即加载,即使第一个代码发布按预期返回,它在第一次调用时运行约30秒。

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

在我看来,在第二种情况下,模型只是在它受到的第一个操作之后才加载。它有任何意义吗?

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

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

在此先感谢。

回答

2

有两只方面的影响在这里:

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

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

顺便说一下:listObjectsOfProperty不需要一个主题 - 它需要一个属性,并可以访问大量的数据库。如果myCollection是一个集合,那么您可能会添加3K以上的项目。

+0

嗨AndyS,感谢您的回复!第一个效果具有所有意义,我认为这就是发生的事情。关于第二个效果,我尝试更改SPARQL查询的Model API调用,但仍需大约30秒才能检索(相同)结果。并且对于混淆抱歉,但主题意味着[DCTERMS的财产主题](http://dublincore.org/documents/dcmi-terms/#terms-subject)。3K是查询的结果。这个系列确实有点少。 – 2015-02-09 21:01:56

+0

AndyS,有这样的说法,是否有任何解决方案,所以我可以立即加载我的模型,就像代码'technologyModel.read(in,“RDF/XML-ABBREV”);'在另一种情况下呢? – 2015-02-09 21:05:19

+0

如果在写入事务中完成,technologyModel.read将在TDB支持的模型上工作。 – AndyS 2015-02-10 16:41:45