我有一个大型数据集(约1B个节点和几十亿个关系),我试图导入Neo4j。我正在使用Neo4j导入工具。节点在一小时内完成导入,但从那时起,导入器陷入节点索引准备阶段(除非我正在读取下面的输出错误)超过12小时。
... 有效内存: 免费机器内存:184.49 GB 最大堆内存:26.52 GB
节点 [>:23.39 MB / s --- | PROPERTIE | NODE:| LAB | * v:37.18 MB / s ------------------------ ---------------------] 1B 在1小时7分18秒内完成54分钟 准备节点索引 [* SORT:11.52 GB -------------------------------------------- ------------------------------------] 881M ...
我的问题是如何加快速度?我在想以下几点: 1.拆分节点和关系的导入命令,然后导入节点。 2.在节点上创建索引 3.合并/匹配以摆脱欺骗 4.重新进口。
这会有帮助吗?还有什么我应该尝试的吗?堆大小是否太大(我想不是,但想要一个意见)?
感谢。
更新
我也尝试在同一台机器上输入正好一半的数据,然后在大致相同的时间内(按比例)再次卡在该阶段。所以我主要是把磁盘空间和内存作为一个问题来消除。
我还检查了我的标题(因为我注意到其他人遇到错误标题时遇到了这个问题)并且它们对我来说似乎是正确的。关于我还应该关注什么的任何建议?
进一步更新
好的,现在它变得有点荒谬了。我将数据大小减少到只有一个大文件(大约3G)。它只包含单一类型的节点,只有id。所以数据看起来像这样。
1 |作者
2 |作者
3 |作者
标题(在单独的文件中)看起来像这样
authorID:ID(作者)|:LABEL
我的导入仍然陷入排序阶段。我很确定我在这里做错了什么。但我真的不知道是什么。这是我的命令行来调用这个
/ var / lib / neo4j / bin / neo4j-import --into data / db / graph.db --id-type string --delimiter“|” \
--bad-tolerance 1000000000 --skip-duplicate-nodes true --stacktrace true --ignore-empty-strings true \
--nodes:作者“data / author / author_header_label.csv,data / author / author_half_label.csv.gz”
容错和跳过重复节点的大多数选项都是为了看看我是否能够以某种方式至少进行一次导入。
答案 0 :(得分:1)
我想我发现了这个问题。我在这里使用的一些提示是http://neo4j.com/developer/guide-import-csv/#_super_fast_batch_importer_for_huge_datasets,它说我可以重复使用带有不同标题的相同csv文件 - 一次用于节点,一次用于关系。我低估了我使用的数据的1-n(ness),导致ID上有很多重复。那个阶段基本上几乎全部用于尝试排序然后重复数据删除。重新处理我的查询以提取分割成节点和rels文件的数据,修复了这个问题。感谢您查看这个!
所以基本上,理想情况下,每种类型的节点总是有单独的文件,而rel会给出最快的结果(至少在我的测试中)。
答案 1 :(得分:0)
看看我为压力测试写的批量导入器:
https://github.com/graphaware/neo4j-stress-test
我在两次提交之间使用了neo4j索引和内存映射。它非常快,适用于两个版本的neo4j。
忽略测试并获取批量导入程序。