【问题标题】:Neo4J Cypher - Is it quicker to load from 100k Json Files or 1 file with 100k entries?Neo4J Cypher - 从 100k Json 文件或 1 个具有 100k 条目的文件加载是否更快?
【发布时间】:2022-01-03 15:56:00
【问题描述】:

我每天将 100k+ json 文件加载到 neo4j 数据库中,每天大约需要 2 到 3 个小时。

我想知道如果将文件全部滚动到一个大文件中,然后由数据库进行迭代,neo4j 是否会运行得更快?

如果是这样,我将需要学习如何在 Python 中执行此操作,但我只想在开始工作之前了解这一点。

我用来加载文件的当前代码 sn-p,范围可以根据生成的文件名每天更改,这些文件名基于 json 记录中的 ID。

UNWIND range(215300000,215457000) as id
WITH DISTINCT id+"_20220103.json" as file
CALL apoc.load.json("file:///output/"+file,null, {failOnError:false})
YIELD value

谢谢!

【问题讨论】:

  • 假设单个文件不会超过内存大小。单个文件会更好,因为它会减少文件 IO 操作的次数,在这两种情况下,数据库要做的工作量是一样的。
  • 您好,感谢您的快速回复!好的,是的,这对我来说很有意义,谢谢。今天有 142k 个文件,总计 683mb。我想所有数据合并到一个的大小不会有太大的不同,我现在必须去实验:-)
  • 祝你好运!即使单个文件不适合内存,您也可以试验并为每个文件确定大小或条目数。
  • 无论如何,请查看 apoc 周期性函数进行批处理,根据更新,您还可以使用 apoc 周期性迭代运行并行更新
  • python 脚本被重新编码以将所有 json 捆绑到一个文件中,并且 cypher 被重新编码以遍历它们。它现在在 2 或 3 分钟内加载 :-)

标签: json neo4j cypher neo4j-apoc


【解决方案1】:

更新了 Python 中的 json 构造,将所有 150k+ json 对象包含到一个文件中,然后 Cypher 更新为迭代文件并针对每个 json 对象运行代码。我最初尝试了 1000 和 100 的批处理大小,但它们导致了许多异常锁,其中代码必须同时尝试更新相同的节点,所以我将批处理大小减小到 1,它加载了大约 99 7 分钟内第一次通过的 json 对象的百分比......比最初的 2 到 3 小时要好得多:-)

我现在使用的代码:

CALL apoc.periodic.iterate(
'CALL apoc.load.json("file:///20220107.json") YIELD value',

'UNWIND value as item.... perform other actions...   
',{ batchSize:1, parallel:true})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 2015-06-22
    • 2013-07-26
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多