Cypher:将属性从int转换为字符串的查询速度非常慢,并在Neo4j服务器中导致OutOfMemoryError
我需要将数值属性的类型迁移为String类型。 为此,我编写了以下简单查询:Cypher:将属性从int转换为字符串的查询速度非常慢,并在Neo4j服务器中导致OutOfMemoryError,neo4j,cypher,spring-data-neo4j,spring-data-neo4j-4,Neo4j,Cypher,Spring Data Neo4j,Spring Data Neo4j 4,我需要将数值属性的类型迁移为String类型。 为此,我编写了以下简单查询: MATCH (n:Entity) SET n.id=toString(n.id) RETURN n 它匹配大约120万个实体(根据解释),所以我没想到它会很快。然而,它并没有在超过5小时后终止。与此同时,neo4j服务器(community,3.0.4)以接近100%的负载运行 我已经在相应的neo4j.conf中配置了这个: dbms.memory.heap.initial_size=4g dbms.memory.
MATCH (n:Entity) SET n.id=toString(n.id) RETURN n
它匹配大约120万个实体(根据解释),所以我没想到它会很快。然而,它并没有在超过5小时后终止。与此同时,neo4j服务器(community,3.0.4)以接近100%的负载运行
我已经在相应的neo4j.conf中配置了这个:
dbms.memory.heap.initial_size=4g
dbms.memory.heap.max_size=4g
dbms.jvm.additional=-XX:+UseG1GC
运行几分钟后,我就可以在日志中看到关于垃圾收集的报告:
[o.n.k.i.c.MonitorGc] GC Monitor: Application threads blocked for 277ms.
后来情况变得更糟:
[o.n.k.i.c.MonitorGc] GC Monitor: Application threads blocked for 53899ms.
最终出现了以下情况:
[o.n.b.v.r.i.c.SessionWorker] Worker for session '10774fef-eed2-4593-9a20-732d9103e576' crashed: Java heap space Java heap space
java.lang.OutOfMemoryError: Java heap space
[o.n.b.v.r.i.c.SessionWorker] Fatal, worker for session '10774fef-eed2-4593-9a20-732d9103e576' crashed. Please contact your support representative if you are unable to resolve this. Java heap space java.lang.OutOfMemoryError: Java heap space
根据我以前的经验,总的可用堆应该足够了,因为我以前运行过“更重”的查询,没有问题。
我认为查询是性能不佳的原因。然而,我不知道如何改进它。
实际上,迁移不必在一个查询或事务中发生。据我所知,这是不可能的,虽然“批量”它。
有什么想法吗?首先,我认为您不需要返回整个120万个节点集,您可以不返回 是的,您可以使用批处理。特别是你会想看看和 以下是如何使用apoc.periodic.iterate()批处理此内容:
谢谢,真是太棒了!使用该配置的运行时间为1.5分钟。进步不错:)
CALL apoc.periodic.iterate(
"MATCH (n:Entity) RETURN n",
"WITH {n} as n SET n.id=toString(n.id)", {batchSize:10000, parallel:true})