gpt4 book ai didi

scala - Neo4j 中的多线程节点创建

转载 作者:行者123 更新时间:2023-12-05 00:33:04 27 4
gpt4 key购买 nike

我以 10000 个批次创建了 100 万个 Neo4j 节点,每个批次都在自己的事务中。奇怪的是,将这个过程与多线程执行并行化并没有对性能产生任何积极影响。就好像不同线程中的事务相互阻塞一样。

这是一段 Scala 代码,它在并行集合的帮助下对此进行了测试:

import org.neo4j.kernel.EmbeddedGraphDatabase

object Main extends App {

val total = 1000000
val batchSize = 10000

val db = new EmbeddedGraphDatabase("neo4yay")

Runtime.getRuntime().addShutdownHook(
new Thread(){override def run() = db.shutdown()}
)

(1 to total).grouped(batchSize).toSeq.par.foreach(batch => {

println("thread %s, nodes from %d to %d"
.format(Thread.currentThread().getId, batch.head, batch.last))

val transaction = db.beginTx()
try{
batch.foreach(db.createNode().setProperty("Number", _))
}finally{
transaction.finish()
}
})
}

这是 build.sbt构建和运行它所需的行:
scalaVersion := "2.9.2"

libraryDependencies += "org.neo4j" % "neo4j-kernel" % "1.8.M07"

fork in run := true

可以通过删除和添加 .par 在并行和顺序模式之间切换在外部调用之前 foreach .控制台输出清楚地显示了 .par执行确实是多线程的。

为了排除这段代码中可能存在的并发问题,我还尝试了一个基于 actor 的实现,结果大致相同(顺序和并行版本分别为 6 秒和 7 秒)。

所以,问题是:我做错了什么还是这是 Neo4j 的限制?
谢谢!

最佳答案

主要问题是您的 tx 大约在同一时间到达。事务提交是对事务日志的序列化写入。如果写入将在时间上交错并且实际节点创建是一个更昂贵的过程,那么您将获得加速。

关于scala - Neo4j 中的多线程节点创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12590907/

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