0

SPARQL 経由で RDF を照会するためにゴマを使用しています。私は大きなファイル (2GB、10GB) を扱っており、その後いくつかのクエリを実行しています。このような大きなファイルの作業中に、java.lang.OutOfMemoryError: Java heap spaceというエラーが発生します。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();
}

また、そのような大きなファイルに NativeStore の代わりに MemoryStore を使用することは可能ですか?

エラーが発生するクエリの例:

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 データセットでこれを試していると思いますか?

元の著者は、Q4 の結果セットのサイズを公表することさえできませんでした。そのクエリの結果のデータセットで明らかな倍率を考えると、25M スケールで約 100m 以上の結果が得られ、100M スケールで 1B もの結果が得られる可能性があると想像できます。

サイズが膨大な結果セットを計算するために必要な中間結合のサイズは、3G の RAM では不十分であることは不思議ではありません。Sesame は優れたシステムですが、その規模でそのクエリに答えるのにどれだけのメモリが必要か、あるいはまったく答えられないかどうかはわかりません。

私の知る限り、そのクエリを 25M で実行したと報告したシステムは 1 つだけで、100M で実行した人はいません。これが、SP2B が優れた、しかしひねくれたベンチマークである理由です。トリプル ストアのパフォーマンスのベンチマークを行おうとしている場合は、もう少し背景資料を読んだり、BSBM を調べたりすることもできます。

于 2013-10-31T16:11:46.793 に答える