2

addRepositoryConnection メソッドを使用したインスタンス化は、SPARQL クエリを使用してモデルを変更してインスタンス化した場合よりも遅いことに気付きました。違いはあるものの、SPARQL update メソッドでさえ、インスタンス化に長い時間がかかります (10,000 トリプレットまで 3.4 分)。複数insertの の実行 (トリプルごとに 1 つのクエリ) または 1 つの大きなinsertクエリを実行しても、メソッドのパフォーマンスは変わりません。まだ遅いです。100 万個のトリプルを追加するのに適切な別の方法はありますか、または役立つ特別な構成はありますか?

RepositoryConnection のコード

Repository myRepository = new HTTPRepository(serverURL, repositoryId);
myRepository.initialize();
RepositoryConnection con = myRepository.getConnection();
ValueFactory f = myRepository.getValueFactory();

i = 0;
j = 1000000;    

while(i < j)(
    URI event    = f.createURI(ontologyIRI + "event"+i);
    URI hasTimeStamp    = f.createURI(ontologyIRI + "hasTimeStamp");
    Literal timestamp   = f.createLiteral(fields.get(0));
    con.add(event, hasTimeStamp, timestamp);
    i++
}    

SPARQL のコード

Repository myRepository = new HTTPRepository(serverURL, repositoryId);
myRepository.initialize();
RepositoryConnection con = myRepository.getConnection();

i = 0;
j = 1000000;    

while(i < j)(
    query = "INSERT {";
    query += "st:event"+i+" st:hasTimeStamp     '"+fields.get(0)+"'^^<http://www.w3.org/2001/XMLSchema#float> .\n"
    + "}"
      + "WHERE { ?x ?y ?z }";
    Update update = con.prepareUpdate(QueryLanguage.SPARQL, query);
    update.execute();

    i++;
}

私が実験を行ったエディションIn MemoryNative Store、同期値が0のゴマリポジトリ

4

1 に答える 1

3

(リクエストされた追加情報を追加したことに気付いたので、返信がかなり遅くなりました)

問題は、私が推測したように、トランザクションを使用して更新操作をまとめていないことです。事実上、実行する各追加操作は単一のトランザクションになり (デフォルトでは、Sesame リポジトリ接続は自動コミット モードで実行されます)、これは遅く、非効率的です。

これを変更するには、( を使用してRepositoryConnection.begin()) トランザクションを開始し、データを追加し、最後に を呼び出しRepositoryConnection.commit()てトランザクションを終了します。

最初のコード例を次のように変更する必要があります。

Repository myRepository = new HTTPRepository(serverURL, repositoryId);   
myRepository.initialize(); 
RepositoryConnection con = myRepository.getConnection(); 
ValueFactory f = myRepository.getValueFactory();

i = 0; 
j = 1000000;    

try {
  con.begin(); // start the transaction
  while(i < j) {
      URI event    = f.createURI(ontologyIRI + "event"+i);
      URI hasTimeStamp    = f.createURI(ontologyIRI + "hasTimeStamp");
      Literal timestamp   = f.createLiteral(fields.get(0));
      con.add(event, hasTimeStamp, timestamp);
      i++; 
  }
  con.commit(); // finish the transaction: commit all our adds in one go.
}
finally {
  // always close the connection when you're done with it. 
  con.close();
}

同じことが、SPARQL 更新を使用したコードにも当てはまります。トランザクションの操作方法の詳細については、Sesame マニュアル、特にリポジトリ API の使用に関する章を参照してください。

余談ですが、HTTP で作業しているため、トランザクションが大きくなりすぎると、クライアントで大量のメモリを消費し始めるリスクがあります。これが発生し始めた場合は、更新をいくつかのトランザクションに分割することをお勧めします。しかし、100 万個のトリプルからなる更新では、まだ問題ないと思います。

于 2013-11-27T03:49:10.167 に答える