0

为了加快插入节点的过程,我在 Neo4j 中开发了自己的插件。主要是因为我需要插入节点和关系,前提是它们之前不存在,使用 REST API 可能会太慢。

如果我尝试调用我的插件 100 次,每次插入大约 100 个节点和 100 个关系,每次调用大约需要 350 毫秒。每个调用都插入不同的节点,以排除锁定原因。

但是,如果我并行化我的调用(每次 2、3、4...),响应时间会随着并行度的增加而下降。当我一次调用 2 个时插入我的 200 个对象需要 750 毫秒,当我调用 3 个时需要 1000 毫秒等等。

我正在使用 HttpWebRequest 从 .NET MVC 控制器调用我的插件。我将 maxConnection 设置为 10000,我可以看到所有 TCP 连接都打开了。

我对这个问题进行了一些调查,但似乎非常错误。我一定做错了什么,无论是在我的 neo4j 配置中,还是在我的插件代码中。使用 VisualVM,我发现 Neo4j 启动的用于处理我的调用的线程正在按顺序工作。看图片链接。

http://i.imgur.com/vPWofTh.png

我的配置:Windows 8、2 核 8G RAM Neo4j 2.0M03 作为服务安装,没有配置调整

希望有人能帮助我。事实上,我将无法在生产中使用 Neo4j,那里会有数十个并发调用,不能按顺序完成。

4

1 回答 1

1

Neo4j 是事务性的。每次提交都会触发文件系统上的 IO 操作,该操作需要在同步块中运行 - 这解释了您附加的图片。因此,最好的做法是运行单线程写入。当然,任何预处理都可以从并行化中受益。

一般来说,为了获得最佳性能,请使用稳定版本(截至今天为 1.9.2)。早期的里程碑构建尚未优化,因此您可能会得到错误的图片。

要考虑的另一件事是插件中使用的事务大小。单笔交易中的 10k 到 50k 应该会给你最好的结果。如果您的事务非常小,则事务开销很大,如果事务很大,则需要大量内存。

写入性能很大程度上取决于底层 IO 子系统的性能。如果可能的话,使用快速的 SSD 驱动器,甚至更好的条带化。

于 2013-07-19T10:33:34.810 回答