neo4j handaling a long transation on one iterator

萝らか妹 提交于 2020-01-02 14:05:15

问题


I would like to go over all my "user" nodes in the graph and do some action on them.

The problem is that I have too many "user" nodes, and I can't hold all of them on the heap.

so, doing something like:

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


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

will cause GC overhead exception.

How can I split it to few transactions , but on the same iterator?

I thought about nested transaction, but the manual says differently. Nested transaction will roll the local memory to the top transactions.


回答1:


Just add a counter and, commit and start a new transaction every 50.000 nodes.

   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();


来源:https://stackoverflow.com/questions/19745725/neo4j-handaling-a-long-transation-on-one-iterator

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!