几乎没有数据超出GC限制

时间:2013-01-30 15:50:31

标签: neo4j

我有一个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);

我可以看到很多空闲记忆。

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

2 个答案:

答案 0 :(得分:0)

尝试每隔几千次操作提交您的交易,即:

事务tx = db.beginTx(); 尝试 {     for(int i = 0; i

答案 1 :(得分:0)

我减少了我的图形(5k节点,2.5米边缘)。 每个节点具有相同数量的边。 使用此代码:

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

执行结束于37s,它很高但是确定

如果我用这个改变代码:

    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”花费更多的时间。为什么?这很正常吗?