Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cypher:将属性从int转换为字符串的查询速度非常慢,并在Neo4j服务器中导致OutOfMemoryError_Neo4j_Cypher_Spring Data Neo4j_Spring Data Neo4j 4 - Fatal编程技术网

Cypher:将属性从int转换为字符串的查询速度非常慢,并在Neo4j服务器中导致OutOfMemoryError

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.

我需要将数值属性的类型迁移为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.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})