【发布时间】:2015-04-10 22:28:21
【问题描述】:
neo4j 2.2.0 在一个 3 机器集群中,具有约 300 万个“用户”节点和约 10 个“品牌”节点
当加载大约 20k 行“:LIKES”关系时:
USING PERIODIC COMMIT 30000
LOAD CSV WITH HEADERS FROM "file://path/to/my/file.csv" AS csvLine
MATCH (user:User {id: toInt(csvLine.userId)})
MATCH (brand:Brand {id: csvLine.brandId})
MERGE (user)-[:LIKES]->(brand)
它从来没有成功过。有时大约需要 6 分钟,然后导致主从交换并失败并出现错误“事务已终止”。其他时候需要超过 10 分钟并导致 http 事务重置。加载时观察到不寻常的垃圾收集模式。配置文件显示两个“MATCH”花费了很少的时间。所以应该是 MERGE 导致缓慢和最终失败。不幸的是,从配置文件中没有进一步显示在 MERGE 中做了什么导致缓慢。
节点计数和关系计数似乎都是合理的。加载将约 3 百万个节点链接到另外约 2 百万个节点的其他关系只需要几分钟。所以一个怀疑是,问题是由于同时将太多用户链接到太少的品牌? Neo4j 在这种情况下无法并行?为什么触发了这么多 GC?
我希望“配置文件”可以提供更多详细信息,例如每个部分花费了多少时间,以及如何进一步细分时间是如何花费在例如 Cypher 编译器或其他内核活动上的?有没有办法读取内部操作日志?
有什么建议或想法吗?谢谢!
【问题讨论】:
-
您是否为
:User(id)和:Brand(id)创建了索引? -
你能分享你的解释输出吗? (停止定期提交以使其正常工作)。