2013-10-10 86 views
0

我正在使用Sesame通過SPARQL查詢RDF。我使用大文件(2GB,10GB)並隨後執行幾個查詢。在處理這些大文件時,我收到一個錯誤java.lang.OutOfMemoryError:Java堆空間。我運行我的應用程序與參數-Xmx3g但它似乎是不夠的這些文件。也許我應該在每次查詢後關閉一個存儲庫?芝麻Java OutOfMemoryError

有我的代碼:

void runQuery() { 
    try { 
     con = repo.getConnection(); 
     TupleQuery tupleQuery = con.prepareTupleQuery(QueryLanguage.SPARQL, queryString); 
     TupleQueryResult result = tupleQuery.evaluate(); 
     while (result.hasNext()) { 
      result.next(); 
     } 
     result.close(); 
     con.close(); 
     } catch (Exception e) { 
      ... 
     } 
    } 
} 

runTests() { 
    File dataDir = new File("RepoDir/"); 
    repo = new SailRepository(new NativeStore(dataDir)); 
    repo.initialize(); 
    ... 
    for (int j = 0; j < NUMBER_OF_QUERIES; ++j) { 
     queryString = queries.get(j); 
     runQuery(); 
    } 
    ... 
    repo.shutDown(); 
} 

而且,是有可能使用MemoryStore的,而不是爲NativeStore這麼大的文件?發出一個錯誤的查詢

例子:

SELECT DISTINCT ?name1 ?name2 
WHERE { 
    ?article1 rdf:type bench:Article . 
    ?article2 rdf:type bench:Article . 
    ?article1 dc:creator ?author1 . 
    ?author1 foaf:name ?name1 . 
    ?article2 dc:creator ?author2 . 
    ?author2 foaf:name ?name2 . 
    ?article1 swrc:journal ?journal . 
    ?article2 swrc:journal ?journal 
    FILTER (?name1<?name2) 
} 
+0

運行查詢時是否得到這個OutOfMemoryError?這非常不尋常。你的查詢是什麼樣的? 至於使用內存存儲:我懷疑你是否可以將10G數據文件放入內存存儲,如果你只有3G堆空間。 –

+0

@JeenBroekstra添加了查詢 – YAPPO

回答

1

所以這是Sp2b而查詢4(信息會一直在你原來的職位,以提供有用的,請與您的問題是通過如果你希望人們徹底的答案)。

SP2B查詢4在5M規模返回〜18.4M結果。 5M數據集(海龜)大約是500M,所以根據你的規格大小,我猜你正在用25M和100M數據集來試試這個數據集?

original authors甚至無法發佈Q4結果集的大小,因爲沒有東西可以計算它(至少在研究範圍內)。考慮到該查詢結果中數據集中的比例因子很明顯,我想我們將在25M規模上獲得大約100m +的結果,並且可能在100M規模上獲得大約1B個結果。

中間連接的大小需要計算一個結果集,其大小爲巨大的,這也難怪3G的RAM不夠用。芝麻是一個很好的系統,但我不知道需要多少內存才能回答該查詢,或者即使它可以回答它。

據我所知,只有一個系統報告在25M運行該查詢,沒有人在100M運行它。這就是爲什麼SP2B是一個偉大的,但是反常的基準。您可能會閱讀更多的背景材料,並且還會研究BSBM,如果您試圖對三重商店績效進行基準測試。