1

天,

我在 Clojure 中编写了一个小程序,它使用neocons将一堆数据塞入 Neo4J v1.9.4,并且在它工作之后一直在修补性能。

在大型数据集上,瓶颈是将关系插入到 Neo4j 中,这并不奇怪,因为它们必须一次完成。所以我的想法是在上面撒一些 pmap 魔法,看看一些简单的并行性是否有帮助。

出乎意料(至少对我而言),这导致 neocons 抛出“java.net.ConnectException:连接被拒绝”异常,这似乎很奇怪,因为客户端将默认为 10 个线程(pmap 创建不超过 numberOfProcessors + 2 个线程) ,而 Neo4j 将默认为 80 个线程(numberOfProcessors * 10,至少在我正确阅读文档的情况下)。上次我检查时,10 小于 80,所以 Neo4j 应该有... <脱鞋>... 很多线程可用。

有问题的代码行在这里- 所做的唯一更改是将“map”调用切换为“pmap”调用。

有什么想法/建议吗?

提前致谢,

彼得

4

1 回答 1

1

彼得,

我也建议使用批处理模式来创建关系。我看到您已经对节点使用了批量创建。

确保您的批量大小大约在 20k 到 50k 个元素之间,这样才能最有效。

否则你最终会遇到两个问题:

  1. 每个 tx 使用一个事务确实会耗尽您的资源,因为它会在每次提交时同步强制写入事务日志
  2. 当创建关系锁同时锁定开始和结束节点时,您将获得许多其他线程等待的锁,因此您可以轻松地停止等待在其开始或结束节点上释放锁的所有服务器线程

您应该通过对 neo4j 服务器发出 kill -3 (或 jstack )来查看这些锁定的线程。

批处理这些关系创建并按子图对它们进行分组,以便批次之间尽可能少的重叠应该有很大帮助。

与您的问题无关,但仍值得稍后调查。

不确定 neocons 在底层使用了什么,但在 neo4j 2.0 中使用事务端点和密码可能会更好。

于 2014-01-06T22:20:32.280 回答