gpt4 book ai didi

java - Neo4j 令人震惊的写入性能

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

我正在使用新的 Bolt 客户端对 Neo4j 3.0.7 进行性能测试,我看到了一些奇怪的结果。我正在尝试一个非常简单的场景:更新插入 1000 个节点(使用合并命令)。

我尝试了几种方法:

  1. 1 个命令的 1000 个同步事务
  2. 1 笔交易 1000 个命令
  3. 1 个命令的 1000 个异步事务(使用 10 个线程)

这是我正在执行的查询(我对 person.id 有唯一性约束): “合并 (n:person {id:'123'}) SET n.name='Diana Kesha', n.address='aaa' .... RETURN n.id”

这是我的查询的执行计划:

Execution plan

结果如下:

  1. 每 1000 个同步事务大约 3 秒(注意不是 1000k)
  2. 1000 个命令的每 1 个事务大约需要 2 秒
  3. 每 1000 个异步事务约 2.5 秒

对于 64 核、128G RAM 的机器来说,结果绝对令人无法接受!

现在,更深入地说,我注意到 Neo4j 使用了 25% 的 RAM(我认为这很好),但在使用第 2 个选项时仅使用 1 核心,在使用 10 个线程时仅使用 10 个核心。

我还注意到,更改 Neo4j 的工作线程对实际使用的核心数量没有影响。

我错过了什么?

最佳答案

您有 2 个相互冲突的数字,您的意思是 1000 还是 1000k = 1M ?

1M 更新 2 秒太慢了?

我建议每个交易进行 1k 到 10k 次更新,然后并行化交易

  1. 您没有使用参数
  2. 不返回任何东西
  3. 使用大写标签(适应约束)

喜欢:

MERGE (n:Person {id:{id}}) 
ON CREATE SET n.name={name} n.address={address}

最好将 (2) 批处理为列表参数

UNWIND {data} as row 
MERGE (n:Person {id:row.id})
ON CREATE SET n.name=row.name n.address=row.address

因此测试 1000 个请求(并行),每个请求 1000 个更新,每次发送包含 1000 个 map 的列表。

UNWIND {data} as row 
MERGE (n:Person {id:row.id})
ON CREATE SET n.name=row.name n.address=row.address

关于java - Neo4j 令人震惊的写入性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40870057/

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