我正在使用Sesame通过SPARQL查询RDF。我处理大文件(2GB,10GB),然后进行一些查询。在处理如此大的文件期间,出现错误java.lang.OutOfMemoryError:Java堆空间。我使用参数-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();
}


另外,是否可以对此类大文件使用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)
}

最佳答案

这就是SP2B Query 4(在您的原始帖子中可能会提供有用的信息,如果您希望人们对他们的回答有所了解,请回答您的问题)。

5M规模的SP2B查询4返回约1840万个结果。 5M数据集(在海龟中)大约为500M,所以考虑到您指定的大小,我想您正在尝试使用25M和100M数据集吗?

original authors甚至无法发布第四季度结果集的大小,因为没有任何东西可以计算出来(至少在研究范围内)。给定该查询结果在数据集中显而易见的比例因子,我想我们在25M规模下将获得约100m +的结果,在100M规模下可能会获得多达1B的结果。

计算结果集所需的中间联接的大小如此之大,并且难怪3G RAM还不够。芝麻是一个很好的系统,但是我不知道要以该规模回答该查询将需要多少内存,甚至根本无法回答。

据我所知,只有一个系统报告该查询以25M运行,而没有人以100M运行该查询。这就是为什么SP2B是一个出色的基准,但却是错误的基准。如果您想对三重存储性能进行基准测试,则可能会读一些背景材料,并研究BSBM。

10-06 13:54