neo4j密码外壳-内存限制异常



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

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

我正在尝试使用密码外壳将CSV文件导入默认的neo4j数据库。它适用于小文件,但我对大小>1GB的csv文件有问题。它失败,错误低于

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

我尝试设置JAVA_OPTS=-Xmx4G来增加JAVA堆空间,但它仍然失败,并出现相同的错误。有人能帮忙吗?cyphershell实用程序是在寻找更多的堆空间,还是neo4j数据库在寻找额外的堆空间?如果cypher shell不能用于导入巨大的文件,那么我导入巨大文件的其他选项是什么?

编辑:我每200行使用一次定期提交,在.cypher文件中有下面的密码脚本,并使用密码外壳运行.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)

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

相反,尝试使用coalesce()来使用第一个非null值,首先尝试获取行值,然后使用节点值:

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)

最新更新