【问题标题】:Import of large dataset in Neo4j taking really long (>12 hours) with Neo4j import tool使用 Neo4j 导入工具在 Neo4j 中导入大型数据集需要很长时间(> 12 小时)
【发布时间】:2015-11-14 17:32:35
【问题描述】:

我有一个大型数据集(大约 1B 个节点和数十亿个关系),我正在尝试将其导入 Neo4j。我正在使用 Neo4j 导入工具。节点在一小时内完成了导入,但是从那时起,导入器在节点索引准备阶段(除非我错误地读取下面的输出)停留了超过 12 个小时。

... 有效内存: 可用机器内存:184.49 GB 最大堆内存:26.52 GB

节点 [>:23.39 MB/s---|属性|节点:|LAB|*v:37.18 MB/s------------------------- --------------------] 1B 1h 7m 18s 54ms 完成 准备节点索引 [*排序:11.52 GB-------------------------------------------- ------------------------------------]881M ...

我的问题是如何加快速度?我在想以下几点: 1. 拆分节点和关系的导入命令并进行节点导入。 2.在节点上创建索引 3. 进行合并/匹配以摆脱欺骗 4. 做 rels 导入。

这会有帮助吗?还有什么我应该尝试的吗?堆大小是否太大(我认为不是,但想征求意见)?

谢谢。

更新
我还尝试在同一台机器上准确导入一半的数据,但它在大致相同的时间(按比例)再次卡在该阶段。所以我基本上已经消除了磁盘空间和内存的问题。
我还检查了我的标题(因为我注意到其他人在标题不正确时遇到了这个问题),他们对我来说似乎是正确的。关于我还应该看什么的任何建议?

进一步更新
好吧,现在它变得有点荒谬了。我将数据大小减少到只有一个大文件(大约 3G)。它只包含单一类型的节点,并且只有 id。所以数据看起来像这样

1|作者
2|作者
3|作者

并且标题(在单独的文件中)看起来像这样

authorID:ID(Author)|: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"


大多数错误容忍和跳过重复节点的选项都在那里,看看我是否可以让它通过导入至少一次。

【问题讨论】:

  • 这是 Neo4j 的哪个版本?
  • 最新的2.3.1
  • 我收回了。它是 2.2.5
  • 嘎...它是 2.3(Ent 试用版)。我感到困惑的原因是我检查了 README 文件,并且出于某种原因说 2.2.5。即使我的安装是从这里neo4j.com/artifact.php?name=neo4j-enterprise-2.3.0-unix.tar.gz
  • 您能看到此时是否有许多 CPU 处于活动状态?它的进展是否超过了 881M ?您能否在此时获取线程转储并附加到此处?

标签: neo4j


【解决方案1】:

我想我找到了问题所在。我在这里使用了一些技巧
http://neo4j.com/developer/guide-import-csv/#_super_fast_batch_importer_for_huge_datasets,它说我可以重复使用具有不同标题的同一个 csv 文件——一次用于节点,一次用于关系。我低估了我使用的数据的 1-n (ness),导致 ID 上有很多重复。那个阶段基本上几乎都花在尝试排序然后重复数据删除上。重新处理我的查询以提取拆分为节点和 rels 文件的数据,解决了该问题。感谢您查看这个!
所以基本上,理想情况下,每种类型的节点和 rel 总是有单独的文件将给出最快的结果(至少在我的测试中)。

【讨论】:

    【解决方案2】:

    看看我为压力测试编写的批量导入器:

    https://github.com/graphaware/neo4j-stress-test

    我在两次提交之间使用了 neo4j 索引和内存映射。它非常快,适用于 neo4j 的两个版本。

    忽略测试并获取批处理导入器。

    【讨论】:

    • 感谢分享。我会检查一下。同时,您能否分享一些关于您在什么时间能够加载多少数据的数字? (我问是因为我有点时间紧张,我想确保,在我试一试之前,这些数字至少是有意义的)。再次感谢。
    • 如果您运行测试,其中之一将下载示例数据集并导入它。我能够在不到 15 分钟的时间内导入超过 3m 的节点。但时间也取决于你的测试环境(cpu、ssd 或磁盘、ram 等)
    • Alessandro,使用 Neo4j BatchInserter,对吧?性能还可以,但可扩展性不行。但如果它对于特定用例来说足够快,那么它绝对是一种替代方案。
    • 完美的让我知道这样做我可以概括它。
    • 可扩展性是什么意思?
    猜你喜欢
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多