2015-02-09 48 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