为neo4j-admin导入设置堆内存

pqwbnv8z  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(146)

我尝试使用neo4j-admin import工具从csv加载数据来加载一个包含数亿个节点的图。导入将运行大约两个小时,但随后崩溃并出现以下错误:

Exception in thread "Thread-0" java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.lang.String.substring(String.java:1969)
at java.util.Formatter.parse(Formatter.java:2557)
at java.util.Formatter.format(Formatter.java:2501)
at java.util.Formatter.format(Formatter.java:2455)
at java.lang.String.format(String.java:2940)
at org.neo4j.unsafe.impl.batchimport.input.BadCollector$RelationshipsProblemReporter.getReportMessage(BadCollector.java:209)
at org.neo4j.unsafe.impl.batchimport.input.BadCollector$RelationshipsProblemReporter.message(BadCollector.java:195)
at org.neo4j.unsafe.impl.batchimport.input.BadCollector.processEvent(BadCollector.java:93)
at org.neo4j.unsafe.impl.batchimport.input.BadCollector$$Lambda$110/603650290.accept(Unknown Source)
at org.neo4j.concurrent.AsyncEvents.process(AsyncEvents.java:137)
at org.neo4j.concurrent.AsyncEvents.run(AsyncEvents.java:111)
at java.lang.Thread.run(Thread.java:748)

字符串
我一直在尝试用几种不同的方法来调整我的最大和初始堆大小设置。首先,我尝试在运行命令加载数据之前简单地创建一个HEAP_SIZE=变量,如下所述,我尝试在JVM上设置堆大小:
export JAVA_OPTS=%JAVA_OPTS% -Xms100g -Xmx100g
但是无论我在导入开始时使用什么设置,我都会得到相同的报告:

Available resources:
  Total machine memory: 1.48 TB
  Free machine memory: 95.00 GB
  Max heap memory : 26.67 GB
  Processors: 48
  Configured max memory: 1.30 TB
  High-IO: true


正如你所看到的,我在一个大型服务器上构建这个,应该有足够的资源可用。我假设我没有为Neo4j正确设置JVM参数,但我在网上找不到任何正确的方法来做这件事。
什么可能导致我的GC内存错误,我如何解决它?这是我可以通过在JVM上投入更多资源来解决的吗?如果是,我如何做到这一点,以便neo4j-admin导入工具可以使用它?
RHEL 7Neo4j CE 3.4.11Java 1.8.0_131

odopli94

odopli941#

这个问题已经通过增加堆内存的最大值解决了。问题是我没有正确地设置堆内存分配。
结果是有一个简单的解决方案;这只是我尝试设置堆内存的时间问题。最初,我在命令行尝试了export JAVA_OPTS='-server -Xms300g -Xmx300g'命令 * 然后 * 运行我的bash脚本来调用neo4j-admin import。这不起作用,neo4j-admin import继续使用相同的堆空间配置。
解决方案是在调用neo4j-admin import的shell脚本中简单地包含设置堆内存的命令。我的shell脚本最终看起来像这样:

#!/bin/bash

export JAVA_OPTS='-server -Xms300g -Xmx300g'

/usr/local/neo4j-community-3.4.11/bin/neo4j-admin import \
--ignore-missing-nodes=true \
--database=mag_cs2.graphdb \
--multiline-fields=true \
--high-io=true \

字符串
这看起来非常明显,但我花了将近一个星期的时间才意识到我需要改变什么。希望这能让其他人避免同样的头痛。

ktca8awb

ktca8awb2#

感谢您描述您的问题。我使用您的解决方案解决了一个类似的问题,其中neo4j分配了太多的堆内存,导致导入拖。
在我的例子中,我试图导入一个具有大量关系(1800+)的数据库。我注意到性能不一致:有时导入速度很快;有时,它会爬行。我注意到在快速导入期间,状态消息会指示导入正在处理关系组-例如:

#Relationship <-- Relationship 1-1824/1824

字符串
在缓慢导入期间,状态消息将指示导入正在通过各个关系进行-例如:

<-- Relationship 6/1824  
<-- Relationship> 7/1824



最后,我注意到导入开始时一直沿着的警告:

WARNING: heap size 1.705GiB is unnecessarily large for completing this import.
The abundant heap memory will leave less memory for off-heap importer caches. Suggested heap size is 1.003GiB


因为neo4j示例的neo4.conf文件没有设置dbms.memory.heap.initial_size,neo4j使用了一种启发式方法来过度分配heap memory。显然,没有足够的内存来支持导入处理大量的关系组,所以它做了大量的交换。
按照这里的建议,我在运行import之前立即将最大堆大小设置为警告建议的值(在本例中为1.003G)。结果:

IMPORT DONE in 9m 10s 102ms.

相关问题