0

我正在使用 Sesame 通过 SPARQL 查询 RDF。我使用大文件(2GB、10GB)并随后进行了几次查询。在处理如此大的文件期间,我收到错误java.lang.OutOfMemoryError: Java heap space我使用参数-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)
}
4

1 回答 1

1

这就是 SP2B 查询 4(在您的原始帖子中提供的信息会很有用,如果您希望人们能够彻底回答他们的问题,请完成您的问题)。

5M 规模的 SP2B 查询 4 ​​返回约 18.4M 的结果。5M 数据集(在海龟中)约为 500M,所以考虑到您声明的大小,我猜您正在尝试使用 25M 和 100M 数据集?

原始作者甚至无法公布第四季度结果集的大小,因为没有人可以计算它(至少在研究范围内)。鉴于该查询结果的数据集中明显的比例因子,我想我们在 25M 的规模上得到大约 100m+ 个结果,在 100M 的规模上可能有多达 1B 个结果。

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

据我所知,只有一个系统报告以 25M 的速度运行该查询,而没有人以 100M 的速度运行它。这就是为什么 SP2B 是一个伟大但反常的基准。如果您尝试对三重商店性能进行基准测试,您可能会阅读更多关于它的背景材料,并查看 BSBM。

于 2013-10-31T16:11:46.793 回答