我有一个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的一个。我不明白为什么我有这个例外。答案 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”花费更多的时间。为什么?这很正常吗?