3

高度に接続されたノードが大量にあり、データベースから削除したい場合があります。いくつかのトラバーサルを経て、削除したいノードのリストが表示されます。

for (Node nodeToDelete : nodesToDelete)
{
    for (Relationship rel : nodeToDelete.getRelationships())
    {
        rel.delete();
    }

    nodeToDelete.delete();
}   

問題は、ヒープをいくら設定しても、次のようになり続けることです 。java.lang.OutOfMemoryError:GCオーバーヘッド制限を超えました

ノードの大きなリストを削除する最良の方法は何ですか?実際に削除する前に、まず関係を削除する必要があることを知っています。コードをステップ実行すると、関係の削除に失敗したように見えます。私が持っているものよりもノードを削除するためのより良い機能はありますか?この削除のどの部分も失敗することは許されていないため、すべてがトランザクションにラップされています。これは問題になる可能性がありますか?

ありがとう!

4

1 に答える 1

5

バッチとしてそれを行います。問題は、削除がトランザクションにラップされていることです。トランザクションは元に戻すことができますが、その元に戻すために、メモリに保存されます。これを試してみてください。

long counter = 0;
for (Node nodeToDelete : nodesToDelete)
{
    if (counter == 1000) {
        tx.success();
        tx.finish();
        tx = db.beginTransaction();
        counter = 0;
    }
    for (Relationship rel : nodeToDelete.getRelationships())
    {
        rel.delete();
    }

    nodeToDelete.delete();
    counter++;
}   
于 2012-08-26T01:43:46.573 に答える