0

我有一个包含 20000 个节点的图。以下代码引发异常。

    double Di=0;
    Iterator<Relationship> rel;
    int cnt=0;
    for (int i = 0; i < geni.size(); i++) 
        { 
          Di=0;
          cnt=0;
          rel = geni.get(i).getRelationships(RelTypes.SIM).iterator();    
          while (rel.hasNext())
              {Di+=(Double)rel.next().getProperty("SIM");   
              cnt++;
              }
          System.out.println(i+" "+cnt);
                      }

此代码打印:

0 11749
1 11974
2 11949
.
.
74 10126
75 10102
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded   

如果我使用:

Runtime r = Runtime.getRuntime(); 
long freeMem = r.freeMemory();
System.out.println("free memory: " + freeMem);

我可以看到很多可用内存。

我有Di的一种,cnt的一种,rel的一种。我不明白为什么我有这个例外。

4

2 回答 2

0

尝试每几千次操作提交您的事务,即:

交易 tx = db.beginTx(); 尝试 { for ( int i = 0; 我
于 2013-01-31T08:27:57.977 回答
0

我减少了我的图表(5k 个节点,2,5m 个边)。每个节点都有相同数量的边。使用此代码:

    Iterator<Relationship> rel;
    int i=0;
    for ( Node n : Neo4Jstore.geneIndex.query( "gene", "**" ) )
        { System.out.println(++i);
          rel = n.getRelationships(RelTypes.SIM).iterator();             
          while (rel.hasNext())
              rel.next();   
        }

执行在 37 秒内结束,很高但还可以

如果我用这个更改代码:

    Iterator<Relationship> rel;
    int i=0;
    for ( Node n : Neo4Jstore.geneIndex.query( "gene", "**" ) )
        { System.out.println(++i);
          rel = n.getRelationships(RelTypes.SIM).iterator();             
          while (rel.hasNext())
              rel.next().getProperty("SIM");    
        }

执行在4分钟内结束!我可以在控制台中看到迭代“i”比“i-1”花费更多的时间。为什么?这是正常的?

于 2013-02-01T17:13:39.137 回答