gpt4 book ai didi

neo4j - 如何解释 Cypher 的 LOAD CSV 子句的性能?

转载 作者:行者123 更新时间:2023-12-05 01:03:38 24 4
gpt4 key购买 nike

我正在使用 Cypher 的 LOAD CSV Neo4J 2.1.2 中的语法。到目前为止,与以前版本中所需的更多手动 ETL 过程相比,这是一个巨大的改进。但是我在一个案例中遇到了一些不是我所期望的行为,我想知道我是否遗漏了什么。

正在使用的密码查询是这样的:

USING PERIODIC COMMIT 500
LOAD CSV FROM 'file:///Users/James/Desktop/import/dependency_sets_short.csv' AS row
MATCH (s:Sense {uid: toInt(row[4])})
MERGE (ds:DependencySet {label: row[2]}) ON CREATE SET ds.optional=(row[3] = 't')
CREATE (s)-[:has]->(ds)

这是 CSV 的几行:
227303,1,TO-PURPOSE-NOMINAL,t,73830
334471,1,AT-LOCATION,t,92048
334470,1,AT-TIME,t,92048
334469,1,ON-LOCATION,t,92048
227302,1,TO-PURPOSE-INFINITIVE,t,73830
116008,1,TO-LOCATION,t,68204
116007,1,IN-LOCATION,t,68204
227301,1,TO-LOCATION,t,73830
334468,1,ON-DATE,t,92048
116006,1,AT-LOCATION,t,68204
334467,1,WITH-ASSOCIATE,t,92048

基本上,我匹配一个 Sense节点(之前导入的)基于它的 ID 值,即第五列。然后我进行合并以获得 DependencySet节点是否存在,或创建它。最后,我正在创建一个 has Sense之间的边缘节点和 DependencySet节点。到目前为止一切顺利,这一切都按预期工作。令人困惑的是随着 CSV 大小增长的性能。
CSV Lines       Time (msec)
------------------------------
500 480
1000 717
2000 1110
5000 1521
10000 2111
50000 4794
100000 5907
200000 12302
300000 35494
400000 Java heap space error

我的期望是增长或多或少是线性的,特别是当我按照 manual 的建议每 500 行提交一次时。 ,但它实际上更接近多项式:
Graph of load time by number of CSV lines

更糟糕的是,在 300k 到 400k 行之间的某个地方,它遇到了 Java 堆空间错误。根据之前导入的趋势,我预计 400k 的导入需要一分钟多一点的时间。相反,它会在运行到堆空间错误之前搅动大约 5-7 分钟。似乎我可以将这个文件分成 300,000 行的块,但这不是“使用周期提交”应该做的,或多或少?我想我也可以给 Neo4J 更多的内存,但同样,不清楚为什么我必须在这种情况下。

另外,要清楚的是,对 Sense.uid 的查找和 DependencySet.label被索引,所以这些的查找惩罚应该非常小。这是架构中的一个片段:
Indexes
ON :DependencySet(label) ONLINE (for uniqueness constraint)
ON :Sense(uid) ONLINE (for uniqueness constraint)

对替代方法的任何解释或想法将不胜感激。

编辑:问题肯定出在查询的 MATCH 和/或 CREATE 部分。如果我从 Cypher 查询中删除第 3 行和第 5 行,它执行得很好。

最佳答案

我假设您已经创建了所有 Sense运行此之前标记的节点 LOAD CSV进口。我认为正在发生的是,当您将节点与标签匹配时 Sense进入内存并从 DependencySet 建立关系到 Sense节点通过 CREATE (s)-[:HAS]->(ds)您正在增加可用堆的利用率。

另一种可能性是需要增加内存映射设置中关系存储的大小。在您的场景中,它看起来像 Sense节点与图中的其他节点具有高度的连通性。发生这种情况时,这些节点的关系存储需要更多内存。最终,当您达到 400k 节点时,堆将达到最大值。在那之前,它需要进行更多的垃圾收集并从磁盘读取。

Michael Hunger 撰写了一篇关于快速内存映射设置的优秀博客文章 LOAD CSV表现。看这里:http://jexp.de/blog/2014/06/load-csv-into-neo4j-quickly-and-successfully/

那应该可以解决您的问题。我看不出你的查询有什么问题。

关于neo4j - 如何解释 Cypher 的 LOAD CSV 子句的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24434112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com