带Sesame的Java OutOfMemoryError

带Sesame的Java OutOfMemoryError,java,rdf,heap-memory,sesame,Java,Rdf,Heap Memory,Sesame,我使用Sesame通过SPARQL查询RDF。我处理大文件(2GB、10GB),并随后进行一些查询。在处理如此大的文件时,我遇到一个错误java.lang.OutOfMemoryError:java堆空间。我用param-Xmx3g运行我的应用程序,但似乎这些文件还不够。也许我应该在每次查询后关闭存储库 这是我的代码: void runQuery() { try { con = repo.getConnection(); TupleQuery tupleQuer

我使用Sesame通过SPARQL查询RDF。我处理大文件(2GB、10GB),并随后进行一些查询。在处理如此大的文件时,我遇到一个错误java.lang.OutOfMemoryError:java堆空间。我用param-Xmx3g运行我的应用程序,但似乎这些文件还不够。也许我应该在每次查询后关闭存储库

这是我的代码:

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();
}
void runQuery(){
试一试{
con=repo.getConnection();
TupleQuery TupleQuery=con.prepareTupleQuery(QueryLanguage.SPARQL,queryString);
TupleQueryResult结果=tupleQuery.evaluate();
while(result.hasNext()){
result.next();
}
result.close();
con.close();
}捕获(例外e){
...
}
}
}
运行测试(){
文件dataDir=新文件(“RepoDir/”);
repo=新存储库(新NativeStore(dataDir));
repo.initialize();
...
对于(int j=0;j<查询的数量;++j){
queryString=querys.get(j);
runQuery();
}
...
回购关闭();
}
另外,对于这样大的文件,是否可以使用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)
}
选择不同的名称1?名称2
在哪里{
?第1条rdf:型式试验台:第。
?第2条rdf:型式试验台:第。
?第1条dc:创作者?作者1。
?作者1 foaf:姓名?姓名1。
?第2条dc:创作者?作者2。
?作者2 foaf:姓名?姓名2。
?第1条swrc:期刊?期刊。
?第2条swrc:期刊?期刊
过滤(?name1,这就是SP2B查询4(在您的原始帖子中提供有用的信息,如果您希望人们对其答案进行彻底的回答,请完成您的问题)

SP2B查询4在5米的范围内返回18.4米的结果。5米数据集(以海龟为单位)约为500米,因此,考虑到您所述的大小,我猜您是在尝试使用25米和100米数据集

他们甚至无法公布第四季度的结果集大小,因为没有什么可以计算出来(至少在研究范围内)。考虑到该查询结果数据集中明显的比例因子,我可以想象,我们在25米的范围内获得了大约1亿个结果,在100米的范围内可能获得了多达1亿个结果

计算结果集所需的中间连接的大小是巨大的,难怪3G内存不够。Sesame是一个很好的系统,但我不知道以这种规模回答该查询需要多少内存,甚至不知道它是否能够回答它


据我所知,只有一个系统报告说以25米的速度运行该查询,而没有人以100米的速度运行该查询。这就是为什么SP2B是一个很棒但有悖常理的基准测试。如果您试图对三重存储性能进行基准测试,您可以阅读更多关于它的背景资料,也可以查看BSBM。

您是否从记忆错误中了解到了这一点运行查询时?这很不寻常。您的查询看起来像什么?至于使用内存存储:如果您只有3G堆空间,我怀疑您能否将10G数据文件放入内存存储。@JeenBroekstra添加了一个查询