从Neo4j加载9M行并将其写入CSV会导致内存不足异常

Lin*_*ina 4 neo4j spring-data-neo4j spring-data-neo4j-4 neo4j-ogm

我有一个大图模型,我需要将以下查询的结果写入csv.

Match (u:USER)-[r:PURCHASED]->(o:ORDER)-[h:HAS]->(i:ITEM) return u.id as userId,i.product_number as itemId
Run Code Online (Sandbox Code Playgroud)

当我"解释"查询时,这是我得到的结果: 在此输入图像描述

它表明估计结果约为9M.我的问题是:

1)获得响应需要很多时间.从neo4j-shell开始需要38分钟!这是正常的吗?顺便说一下,我有所有的模式索引,它们都是在线的.

2)当我使用SpringDataNeo4j获取结果时,它会抛出"java.lang.OutOfMemoryError:GC开销超出限制"错误,当SDN尝试将加载的数据转换为@QueryResult对象时会发生这种情况.

我尝试以各种方式优化查询,但没有任何改变!我的印象是我做错了什么.有谁知道如何解决这个问题?我应该去批量读/写吗?

PS我正在使用Neo4j社区版本:3.0.1,这些是我的sysinfos: 在此输入图像描述

这些是我的服务器配置.

dbms.jvm.additional=-Dunsupported.dbms.udc.source=tarball
use_memory_mapped_buffers=true
neostore.nodestore.db.mapped_memory=3G
neostore.relationshipstore.db.mapped_memory=4G
neostore.propertystore.db.mapped_memory=3G
neostore.propertystore.db.strings.mapped_memory=1000M
neostore.propertystore.db.index.keys.mapped_memory=500M
neostore.propertystore.db.index.mapped_memory=500M
Run Code Online (Sandbox Code Playgroud)

Vin*_*nce 7

虽然Neo4j会在匹配它们时将结果传输给您,但是当您使用SDN时,它必须将输出收集到单个@QueryResult对象中.要避免OOM问题,您需要确保应用程序有足够的堆内存可用于加载所有9m响应,或使用neo4j-shell,或使用专用流媒体接口,例如https://www.npmjs. com/package/cypher-stream.(告诫者:我没试过这个,但看起来应该这样做)