neo4j 密码 shell - 内存限制异常
neo4j cypher shell - memory limit exception
我是neo4j的新手。在此处发布此问题之前,我已经做了一些研究,但找不到适合我的解决方案。我有一个具有 32GB RAM 的 ubuntu 虚拟机。我目前正在使用 neo4j-community edition 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 堆 space 但它仍然失败并出现相同的错误。有人可以帮忙吗? cypher-shell 实用程序是在寻找更多的堆 space 还是 neo4j 数据库在寻找额外的堆 space?如果 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)
我运行对此进行了解释,并在查询计划中看到了一个 Eager 运算符,它基本上取消了定期提交并导致所有结果都显示在内存中,这导致了堆外手术。此处的 FOREACHes 导致此问题,您将无法在使用定期提交时使用此方法。
改为尝试使用 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的新手。在此处发布此问题之前,我已经做了一些研究,但找不到适合我的解决方案。我有一个具有 32GB RAM 的 ubuntu 虚拟机。我目前正在使用 neo4j-community edition 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 堆 space 但它仍然失败并出现相同的错误。有人可以帮忙吗? cypher-shell 实用程序是在寻找更多的堆 space 还是 neo4j 数据库在寻找额外的堆 space?如果 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)
我运行对此进行了解释,并在查询计划中看到了一个 Eager 运算符,它基本上取消了定期提交并导致所有结果都显示在内存中,这导致了堆外手术。此处的 FOREACHes 导致此问题,您将无法在使用定期提交时使用此方法。
改为尝试使用 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)