3

メモリ管理に関して少し混乱しています。

Java アプリケーション内の組み込みモードで neo4j を使用しています。バージョン - 1.8.1。JVM バージョン - 1.6

ネストされた for ループを含む for ループを持つシングル スレッド ローダーがあります。外部 for ループ内で、graphDb.beginTx();mysql からテスト オブジェクトの ID を取得し、そのためのノードを作成します。内側の for ループでは、関連するオブジェクトを取得するために mysql にクエリを実行しています。それらのノードと、外部ループで作成したノードとの対応関係を作成します。

外部 for ループの最後で、tx.success()andを実行しtx.finish()ます。

for (int x = 0; x < 10000000; x++) {
    Transaction tx = graphDb.beginTx();
    Node n = graphDb.createNode();
    Long id = n.getId();
    System.out.println("ID: " + id);
    n.setProperty("TestId", x); 
    * * * get the mysql ids * * * *
    for (int y = 0; y < mysqlidlist; y++) {
        Node n1 = graphDb.createNode();
        Long id2 = n1.getId();
        n1.setProperty("InnerTestId", y);
        Relationship rel = n.createRelationshipTo(n1, NodeRelation.ATTRIBUTE);
        rel.setProperty("Weight", 0.3);
    }
    tx.success();
    tx.finish();
    tx = null;
}

私の測定値に基づいて、Neo4j はトランザクションが取得したメモリを解放すると考えました。ただし、メモリ使用量が常に増加し、しばらくすると Xmx 設定に達します。他に漏れがないことを確認するためにプロファイルします。私は最後に他のすべての変数を null に設定しています。これは、GC がより良い方法でそれを取得するのに役立つはずです。

私の理解は間違っていますか?もしそうなら、メモリ管理に関して推奨されるベストプラクティスは何ですか?

次のステップ - シングル スレッド ローダーはマルチスレッド ローダーに拡張されるため、メモリ管理とトランザクション管理が堅牢であることを確認したいと考えています。

本当にありがとう!

よろしく、

サチン

4

2 に答える 2

1

この種の大規模な挿入では、トランザクションが必要ない場合、バッチ挿入を使用することをお勧めします。

http://docs.neo4j.org/chunked/milestone/batchinsert.html


または、お勧めしません: コードのスニペットを使用する場合は、次のようなものを追加します: if(y%1000==0) { tx.success();tx.finish()} for ループ内にコミットしてメモリを解放しますn回の挿入ごとに使用されますが、遅くなります

于 2013-03-12T13:06:30.730 に答える
0

キャッシュをオフにしてみてください (cache_type=none を使用)。docs.neo4j.org/chunked/milestone/configuration-caches.html

于 2013-03-12T04:49:42.910 に答える