Neo4j 1.9使用多线程新保守派客户端抛出“java.net.ConnectException:Connection refused”

时间:2013-10-18 00:16:15

标签: clojure neo4j

天儿真好,

我在Clojure中编写了一个小程序,使用neocons将大量数据插入到Neo4J v1.9.4中,并且在使用它之后一直在修改性能。

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

出乎意料地(至少对我来说),导致neocons抛出“java.net.ConnectException:Connection refused”异常,这似乎很奇怪,因为客户端将默认为10个线程(pmap创建的不超过numberOfProcessors + 2个线程),而Neo4j将默认为80个线程(numberOfProcessors * 10,至少如果我正在读the docs右)。上次我检查时,10小于80,所以Neo4j应该......<脱鞋> ...需要很多线程。

有问题的代码行是here - 唯一的变化是将“地图”调用切换为“pmap”调用。

有任何想法/建议吗?

提前致谢,

彼得

1 个答案:

答案 0 :(得分:1)

彼得,

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

确保您的批量大小大致在20k到50k之间,才能最有效。

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

  1. 每个tx使用一个事务确实会耗尽您的资源,因为它会在每次提交时对事务日志执行同步强制写入
  2. 由于创建关系会锁定起始节点和结束节点,因此您将获得其他线程等待的大量锁定,因此您可以轻松地停止等待锁定在其开始或结束时释放的所有服务器线程-nodes
  3. 你应该通过对neo4j服务器发出kill -3(或jstack)来看到这些锁定的线程。

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

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

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