apoc.periodic.iterate 如何与资源协同工作?
apoc.periodic.iterate 如何工作?
例如,当运行 call apoc.periodic.iterate("MATCH (n) RETURN n", "DETACH DELETE n", {batchSize:1000}) 时,它是会在 MATCH RETURN 语句中添加 LIMIT 限制以便只返回 batchSize 数量的结果,还是会返回所有结果但只将 batchSize 数量的行传递给 DETACH DELETE 语句?
它不会添加 LIMIT。它会按原样执行“MATCH (n) RETURN n”语句。关键要记住的是,存在一个待消费的结果流。它不会创建一个巨大的结果集,从而影响堆内存。有一个名为 iterateAndExecuteBatchedInSeparateThread 的方法,它使用单独的线程,并按参数中指定的块大小从该流中“消费”数据。
第一个参数前缀用于强制使用 slotted runtime,因为编译时 runtime 会将结果收集在内存结构中。这对于巨大的结果集来说是不可取的,因此我们确保第一个部分以流式传输。该流填充了 batchSize 数量元素的列表。这些列表作为参数传递给第二个语句。在示例中,第二个参数将临时更改为 UNWIND $_batch as n DETACH DELETE n。所以没有显式的 LIMIT,但由于 UNWIND 的存在,存在一个隐式的限制。您可以使用 {iterateList:false} 关闭列表收集,并为第一个语句的每个结果触发第二个语句。
查询只会在原始查询完成后才会返回给客户端,因此只有一个往返。发生的情况是结果以批处理方式流式传输并需要被消费。此操作通过一个单独的线程进行,并且只会占用有限的内存,因此资源不会耗尽。外部连接将保持打开状态,直到所有内容都被处理完毕,直到最后一个批次被拉入内存(即使尚未通过流式方式消费),此时连接才会关闭。
代码链接在此
此页面有帮助吗?