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