2012-08-25 57 views
3

我有大量高度連接的節點,有時我想從數據庫中刪除。通過一對夫婦遍歷,我風與節點列表,我想刪除:刪除Neo4j中的大量節點時出現GC OutOfMemory錯誤

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

    nodeToDelete.delete(); 
} 

的問題是,無論我怎麼設置大型堆我,我不斷收到: java.lang.OutOfMemoryError:超出GC開銷限制

刪除大量節點列表的最佳方法是什麼?我知道我必須在實際刪除它們之前先刪除它們之間的關係 - 我逐步執行代碼,並且它似乎在刪除關係時失敗。有刪除節點比我有更好的功能?一切都被封裝在一個非常重要的事務中,因爲這個刪除的任何部分都不允許失敗 - 這可能是一個問題嗎?

謝謝!

回答

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++; 
} 
+0

你不需要根for循環結尾處的tx.success(); tx.finish()部分嗎? – ulkas

+0

是的,我假設他會在上面提供的那部分代碼中注入這些代碼,IE會保留他已有的'finish()'。 – Nicholas

+0

如何使用Cypher進行這種配料?我有一個擁有數百萬節點的9 GB數據庫,我想刪除它的一個主要部分(但不是全部)。然而,即使有一個'MATCH({x:'something'}),DETACH DELETE x'也會拋出'OutOfMemoryError',即使使用了'-Xmx4g''''xmx10g'! (總內存爲16 GB) –

相關問題