Java堆空间不足:Neo4j图形数据库

3
我已成功将dblp数据集迁移到neo4j数据库,并使用neo4jShell运行cypher查询。该数据库具有数百万个出版物和作者之间的节点和关系。现在,当我尝试在neo4j数据库上运行查询时,处理需要10到12小时,然后最终出现以下错误:
Error occurred in server thread; nested exception is: java.lang.OutOfMemoryError: Java heap space 我正在使用neo4j社区版版本2.2.3、jdk 1.7机器,内存为8GB和核心i7处理器。
查询:
neo4j-sh (?)$ MATCH (p:`publication`)-[:`publishedby`]->(a:`author`)
RETURN p.year, p.type, a.id, count(*) order by a.id desc LIMIT 25;

请专家们为我提供任何从这个异常中解决的方法。


似乎 Neo4J 不是一个很好的选择。对于关系型数据库来说,这将是一个微不足道的问题。对象数据库对于深度对象图形是有意义的。但这里似乎不是这种情况。 - duffymo
尝试重写您的查询。例如:MATCH (a:author) WITH a LIMIT 25 MATCH (p:publication)-[p:publishedby]->(a) RETURN p.year, p.type, a.id ORDER BY a.id desc。使用 WITH 语句。 - FylmTM
可能是 https://dev59.com/q4Hba4cB1Zd3GeqPNB9Z 的重复问题,这个问题讲述了什么是 OutOfMemoryError,以及如何调试和修复它。 - Raedwald
@Raedwald,这不是你所建议的重复问题,我在Neo4j数据库上遇到了这个异常。我完全知道JVM内存问题...但问题在于我想通过修改查询或修改Neo4j的任何配置来解决它。 - Muhammad Adnan
@FylmTM 谢谢你的回复,兄弟。我会尝试这个查询。 - Muhammad Adnan
2个回答

1
您可能需要将Java进程的最大内存设置得更多。 Java进程仅使用配置的最大内存量,通常默认为256 MB。 使用-Xmx参数来实现此操作。阅读如何设置JVM的最大内存使用?以获得更详细的说明。
请注意,您必须使用64位jdk和64位操作系统才能将Xmx设置为4 GB以上。

1
请将问题标记为重复,而不是用另一个SO问题的链接来回答它... - l4mpi
我指出了一个解决方案,并添加了一些建议。我认为我的答案并不差。也许我应该将问题标记为重复,但是在Neo4j方面也有解决方案,因此它并不完全是重复的。请重新考虑你的踩。 - Ricardo Vila
在我看来,你的建议虽然有效,但应该是一条评论,而不是答案;再加上一个重复标记。你说得对,OP的Neo4j查询可能远没有得到优化,但由于你的回答并没有解决这个问题,所以它并不相关。我非常反对为那些显然懒得搜索的人提供指导(SO和其他地方有无数资源描述什么是OutOfMemoryError及如何解决它),而且你的回答没有提供任何不能在SO上找到的重要信息,因此被我点了踩。 - l4mpi
@Raedwald,这不是你所建议的重复问题,我在neo4j数据库上遇到了这个异常。我完全意识到JVM内存问题...但问题在于我想通过修改查询或修改neo4j的任何配置来解决这个问题。 - Muhammad Adnan
@Ricardo,谢谢你的回复兄弟,实际上我在使用Neo4j数据库时遇到了问题,在一个十亿节点数据集上运行查询。这就是我想要解决的问题。 - Muhammad Adnan
@l4mpi,我完全了解Java中的java.lang.OutOfMemoryError:,但请考虑我的问题更多地涉及Neo4j查询优化。在发布我的问题之前,我已经做了很多研究,所以请确保您不是在这里喂养任何人...我们都是学习者,任何帮助都将不胜感激 :) - Muhammad Adnan

1
作为您的数据集是公共数据集,如果您能分享您的数据库将非常有帮助。
通常情况下,您要计算成千上万或十亿条路径,然后在事后进行聚合,这需要一些时间。加上可能太少的内存和慢速磁盘,从磁盘加载数据需要很长时间。
这是一个全局图查询,如果您使用 PROFILE 前缀运行它,就可以看到。
请确保您的 ID 属性是数字类型!
我会将查询更改为以下内容:
// this is the expensive operation, to order millions of authors by id
// still, do it and take the top 25
MATCH (a:author) WITH a order by a.id LIMIT 25
// find publications for the top 25 authors
MATCH (a)<-[:publishedby]-(p)
// return aggregation
RETURN a.id, p.year, p.type, count(*)
LIMIT 25;

启动neo4j-shell时使用合理的内存设置:

  • 停止服务器
  • 编辑conf/neo4j-wrapper.conf,将min和maxmemory设置为4000
  • 编辑conf/neo4j.properties,将dbms.pagecache.memory设置为3G
  • 启动服务器,运行bin/neo4j-shell

如果您在独立模式下运行neo4j-shell,请停止服务器并使用以下命令:

export JAVA_OPTS="-Xmx4000M -Xms4000M -Xmn1000M" 
bin/neo4j-shell -path data/graph.db -config conf/neo4j.properties

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接