neo4j cypher shell - 内存限制异常

Posted

技术标签:

【中文标题】neo4j cypher shell - 内存限制异常【英文标题】:neo4j cypher shell - memory limit exception 【发布时间】:2020-07-03 11:58:22 【问题描述】:

我是 neo4j 的新手。在在这里发布这个问题之前,我已经做了一些研究,但找不到适合我的解决方案。我有一个 32GB RAM 的 ubuntu 虚拟机。我目前正在使用 neo4j-community 版本 4.0.2 并在我的 neo4j.conf 文件中获得以下配置。

dbms.memory.heap.initial_size=5120m
dbms.memory.heap.max_size=5120m
dbms.memory.pagecache.size=10g

我正在尝试使用 cypher-shell 将 CSV 文件导入默认的 neo4j 数据库。它适用于小文件,但我对大小 > 1GB 的 csv 文件有疑问。它失败并出现以下错误

由于超出内存限制,无法分配 524288 字节;使用=2147266560,最大值=2147483648

我尝试设置 JAVA_OPTS=-Xmx4G 来增加 Java 堆空间,但仍然失败并出现同样的错误。有人可以帮忙吗? cypher-shell 实用程序是在寻找更多的堆空间,还是 neo4j 数据库在寻找额外的堆空间?如果无法使用 cypher-shell 导入大文件,我还有哪些其他选项可以导入大文件?

编辑:我每 200 行使用一次定期提交,并且我在 .cypher 文件中有以下密码脚本,并使用 cypher-shell 运行 .cypher 文件

CREATE INDEX ON:Review (nr);

USING PERIODIC COMMIT 200 LOAD CSV WITH HEADERS FROM "file:///12Review.csv" AS row 
MERGE (R:Review nr: toInteger(row.nr)) 
WITH row, R
FOREACH(ignoreMe in CASE WHEN row.reviewDate IS NULL THEN [] ELSE [1] END| SET R.reviewDate =row.reviewDate)
FOREACH(ignoreMe in CASE WHEN row.title IS NULL THEN [] ELSE [1] END| SET R.title = row.title)
FOREACH(ignoreMe in CASE WHEN row.rating1 IS NULL THEN [] ELSE [1] END| SET R.rating1 =row.rating1) 
FOREACH(ignoreMe in CASE WHEN row.rating2 IS NULL THEN [] ELSE [1] END| SET R.rating2 =row.rating2) 
FOREACH(ignoreMe in CASE WHEN row.rating3 IS NULL THEN [] ELSE [1] END| SET R.rating3 =row.rating3) 
FOREACH(ignoreMe in CASE WHEN row.rating4 IS NULL THEN [] ELSE [1] END| SET R.rating4 =row.rating4)

【问题讨论】:

您好,我们确实需要有关您如何进行导入的更多详细信息。加载 CSV?如果是这样,您是否使用 PERIODIC COMMIT?什么是进口查询?您是否对查询进行了解释以确定是否已创建并正在使用适当的索引? @InverseFalcon 更新了我的问题以添加您要求的信息 【参考方案1】:

我正在对此运行 EXPLAIN 并在查询计划中看到一个 Eager 运算符,它基本上取消了定期提交并导致所有结果显示在内存中,这导致了堆外操作。这里的 FOREACH 导致了这种情况,您在使用定期提交时将无法使用这种方法。

改为尝试使用coalesce()使用第一个非空值,先尝试获取行值,然后使用节点值:

USING PERIODIC COMMIT 10000 LOAD CSV WITH HEADERS FROM "file:///12Review.csv" AS row 
MERGE (R:Review nr: toInteger(row.nr)) 
SET R.reviewDate = coalesce(row.reviewDate, R.reviewDate),
R.reviewDate = coalesce(row.title, R.title),
R.reviewDate = coalesce(row.rating1, R.rating1),
R.reviewDate = coalesce(row.rating2, R.rating2),
R.reviewDate = coalesce(row.rating3, R.rating3),
R.reviewDate = coalesce(row.rating4, R.rating4)

【讨论】:

以上是关于neo4j cypher shell - 内存限制异常的主要内容,如果未能解决你的问题,请参考以下文章

Neo4j/Cypher 测试数据请求

如何往neo4j中批量插入cypher语句

neo4j cypher 节点可以模糊匹配么

Neo4j —— Cypher 查询语言

CYPHER 语句(Neo4j)

Neo4j:如何删除与 cypher 的特定关系?