2013-11-02 24 views
1

我想查看圖中所有的「用戶」節點並對它們執行一些操作。neo4j處理一個迭代器上的長轉換

問題是我有太多「用戶」節點,我無法將它們全部放在堆上。

所以,做這樣的事情:

try (Transaction tx = graphDb.beginTx()) 
{ 
    Iterator<Node> n_column = autoNodeIndex.get("type", "user"); 


    while (n_column.hasNext()) { 
    //create relationship for node... 
    } 
    tx.success(); 
} 

會導致GC開銷例外。

如何將它拆分爲少量事務,但在同一個迭代器上?

我想過嵌套事務,但手冊中有不同的說法。嵌套事務將本地內存滾動到頂部事務。

回答

1

只需添加一個計數器,並且每50.000個節點提交併啓動一個新事務。

Transaction tx = graphDb.beginTx(); 
    Iterator<Node> n_column = autoNodeIndex.get("type", "user"); 

    int counter=0; 
    while (n_column.hasNext()) { 
    //create relationship for node... 
    if (++counter % 50000 == 0) { 
     tx.success(); tx.close(); 
     tx = graphDb.beginTx(); 
    } 
    } 
    tx.success(); 
    tx.close(); 
+0

作品!當我關閉事務時,我認爲它會終止迭代器。我想這不是... – skme

+0

我的數據庫變大了,現在它有1000萬用戶。所以現在,它不能再工作......在〜60k用戶之後,我在java堆上再次發生「outOfMemory」錯誤。我認爲每次關閉事務時都會清除關係,但迭代器會一直保存堆中的數據。我怎樣才能避免這種情況? – skme