Neo4j 图形数据库 java.lang.OutOfMemoryError:Java 堆空间。 Neo4j 图数据库

Posted

技术标签:

【中文标题】Neo4j 图形数据库 java.lang.OutOfMemoryError:Java 堆空间。 Neo4j 图数据库【英文标题】:Neo4j graph database java.lang.OutOfMemoryError: Java heap space. Neo4j graph database 【发布时间】:2015-11-13 22:57:22 【问题描述】:

我已成功将 dblp 数据集迁移到 neo4j 数据库,并使用 neo4jShell 运行密码查询。该数据库具有数百万个节点以及出版物和作者之间的关系。现在,当我尝试在 neo4j 数据库上运行查询时,需要 10 到 12 个小时进行处理,然后出现此错误

服务器线程发生错误; 嵌套异常是:java.lang.OutOfMemoryError: Java heap space

我正在使用 neo4j 社区版 2.2.3 版, jdk 1.7 机器,8 GB 内存和核心 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 不太合适。对于关系数据库来说,这将是一个微不足道的问题。对象数据库对深度对象图很有意义。这听起来不像这里的情况。 重复How to set the maximum memory usage for JVM? 尝试重写您的查询。示例: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 语句。 ***.com/questions/24510188/…的可能重复 @Raedwald 这不是您建议的重复问题,我在 neo4j 数据库上遇到了这个异常。我完全了解 jvm 内存问题......但这里的问题是我想要一个解决方案来解决这个问题我修改查询或修改 neo4j 的任何配置 【参考方案1】:

您可能应该为您的 java 进程设置更多的最大内存。 Java 进程只使用配置的最大内存量,默认情况下通常只有 256 MB。使用 -Xmx 参数来实现这一点。阅读此How to set the maximum memory usage for JVM? 以获得更详细的说明。

请注意,您必须使用 64 位 jdk 和 64 位操作系统才能将 Xmx 设置为 4 GB 以上。

【讨论】:

请将问题标记为重复问题,而不是使用指向另一个 SO 问题的链接来回答它... 我指出了一个解决方案并添加了一些建议。我不认为我的回答不好。也许我应该将问题标记为重复,但 Neo4j 方面也有解决方案,因此它不完全是重复的。请重新考虑您的反对意见。 IMO 您的建议虽然有效,但应该是评论而不是答案;结合重复标志。你是对的,OPs Neo4j 查询可能远未优化,但由于你的答案没有解决它不相关的问题。我非常反对用勺子喂那些显然懒得去搜索的人,比如 OP(SO 和它之外有无数的资源描述了 OutOfMemoryError 是什么以及如何处理它),而你的答案没有'不要添加任何在 SO 上找不到的重要内容,因此投反对票。 @Raedwald 这不是您建议的重复问题,我在 neo4j 数据库上遇到了这个异常。我完全了解 jvm 内存问题...但这里的问题是我想要一个解决方案来解决这个问题,我修改查询或修改 neo4j 的任何配置。 @Ricardo 感谢兄弟的回复,实际上我在对十亿节点数据集运行查询时遇到了 neo4j 数据库的问题。这就是我要解决的问题。【参考方案2】:

由于您的数据集是公共数据集,如果您可以共享您的数据库,将会非常有帮助。

一般而言,您正在计算数百万或十亿条路径,而您在事后聚合这些路径,只需要一段时间。 再加上内存可能太少和磁盘速度较慢,从磁盘加载数据需要很长时间。

这是一个全局图形查询,如果你运行它以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

【讨论】:

以上是关于Neo4j 图形数据库 java.lang.OutOfMemoryError:Java 堆空间。 Neo4j 图数据库的主要内容,如果未能解决你的问题,请参考以下文章

springboot2.x+neo4j创建图形数据库

Neo4j 图形数据库 java.lang.OutOfMemoryError:Java 堆空间。 Neo4j 图数据库

图形数据库Neo4J简介

如何可视化从嵌入式 Neo4j Java 应用程序创建的 Neo4j 图形数据库

图形数据库neo4j

(1.1)——图形数据库neo4j安装