将大量数据集导入Neo4j非常慢

时间:2016-06-20 16:05:00

标签: java mongodb neo4j database

我有一个相当大的数据集,大约6800万个数据点。数据当前存储在MongoDB中,我编写了一个Java程序,通过数据将数据点链接在一起,并使用Cypher命令将它们放在Neo4j数据库中。我用一组测试数据(约150万)运行这个程序,它运行起来,一夜之间运行。现在,当我尝试导入整个数据集时,程序非常慢。整个周末都只有大约350,000个数据点。通过一些简短的测试,似乎Neo4j是瓶颈。自从我停止Java程序以来已经过了半个小时,但Neo4j的CPU使用率为100%,并且仍在添加新节点(来自Java程序)。反正有没有克服这个瓶颈?我考虑过多线程,但是因为我正在尝试创建一个网络,所以有很多依赖项和非线程安全的操作正在执行。谢谢你的帮助!

编辑:我拥有的数据是用户列表。包含的数据是用户ID,以及用户朋友ID的数组。我的Cypher查询看起来有点像这样: "u:USER {id:" + currentID + "}) CREATE (u)-[:FRIENDS {ts:" + timeStamp}]->(u" + connectionID + ":USER {id:" + connectionID + "})" 对不起,如果这真的很糟糕,这个很新的

3 个答案:

答案 0 :(得分:1)

你应该先看看这个:

neo4j import slowing down

如果您仍然决定DIY,那么您应注意以下几点:首先,请确保您不会尝试在一次交易中导入所有数据,否则您的代码将花费大部分时间垃圾收集器暂停的时间。其次,确保您为Neo4j进程(或您的应用程序,如果您正在使用Neo4j的嵌入式实例)提供了大量内存。对于Neo4j来说,6800万个节点是微不足道的,但是如果您正在生成的Cypher一直在寻找例如创建新的关系,如果你没有分配足够的内存,那么你将遇到严重的分页问题。最后,如果您按属性(而不是id)查找节点,那么您应该使用标签和模式索引:

http://neo4j.com/news/labels-and-schema-indexes-in-neo4j/

答案 1 :(得分:1)

您是否配置了neo4j.properties和neo4j-wrapper.conf文件? 强烈建议根据机器上可用的RAM量调整值。

在conf / neo4j-wrapper.conf中的

我通常用于12GB的RAM服务器

wrapper.java.initmemory=8000
wrapper.java.maxmemory=8000

在conf / neo4j.properties中我设置了

dbms.pagecache.memory=8000 

有关在几分钟内导入10M节点的完整示例,请参阅http://neo4j.com/blog/import-10m-stack-overflow-questions/,这是一个很好的起点

SSD也建议加快导入。

答案 2 :(得分:0)

将批量数据加载到数据库时,我学到的一件事就是暂时关闭目标表上的索引。否则,添加的每个新记录都会导致对索引进行单独更新,从而导致磁盘上的批次工作。在数据加载完成后,在单独的操作中重新索引整个表的速度要快得多。 YMMV。