【问题标题】:Neo4j crashes on batch importNeo4j 在批量导入时崩溃
【发布时间】:2014-12-12 08:15:12
【问题描述】:

我正在导入属于一个合并和关系创建语句的所有节点,但 Neo4j 因 StackOverflowExceptions 或“错误(-v 用于扩展信息)而崩溃: 解组返回标头时出错;嵌套异常是: java.net.SocketException:软件导致连接中止:recv failed"

我承认我的方法可能有问题,但我有一些 (A) 节点与类型 (B) 的节点有大约 8000 个关系,而 (B) 节点与其他 (A) 节点有大约 7000 个关系。

我基本上有一个大的 MERGE 语句,它使用 CREATE UNIQUE 创建 (A) 和 (B) 节点,该节点在最后创建所有关系。我将所有这些 Cypher 存储在一个文件中并通过 Neo4jShell 导入它。

例子:

MERGE (foo:A { id:'blah'})
MERGE (bar:B {id:'blah2'})
MERGE (bar2:B1 {id:'blah3'})
MERGE (bar3:B3 {id:'blah3'})
MERGE (foo2:A1 {id:'blah4'})
... // thousands more of these
CREATE UNIQUE foo-[:x]->bar,  bar-[:y]->foo2, // hundreds more of these

有没有更好的方法来做到这一点?我试图避免创建所有 Merge 语句,然后匹配每个语句以在另一个查询中创建关系。我在两种方式上的导入性能都很慢。将每个合并拆分为事务很慢(2 小时导入 60K,节点/关系)。当前的方法使 neo4j 崩溃

当前的一个大合并/创建唯一方法适用于第一个大插入,但之后当下一个大插入使用 5000 个节点和 8000 个关系时会失败。这是第一次大合并的结果:

Nodes created: 756
Relationships created: 933
Properties set: 5633
Labels added: 756
15101 ms

我正在使用具有 8GB RAM 的 Windows 7 计算机。在我的 neo4j.wrapper 中,我使用:

wrapper.java.initmemory=512
wrapper.java.maxmemory=2048

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    有 3 件事可能会有所帮助:

    1. 如果你真的不需要合并,你应该只使用一个 create 来代替。 Create 效率更高,因为它不必检查现有关系

    2. 确保您的索引正确

    3. 您现在在 1 笔大交易中拥有一切。您声明了在 1 个事务中包含每个语句的替代方案。都不适合你。但是,您可以进行交易,例如,每个交易 100 条语句。这种方法应该比每个事务 1 个语句更快,并且仍然比将所有内容放在 1 个大事务中使用更少的内存

    【讨论】:

    • 谢谢,我尽可能将所有合并转换为创建,并增加了一些服务器属性的内存。它仍然比我想象的要慢得多(创建一些对象需要 4 分钟)。我有数百万要进口,所以这行不通。我想我在放弃 Neo4j 之前的最后一招是尝试 BatchImporter
    • @AriesOnTheCusp 进行 100 或 1000 条语句的事务处理没有帮助?
    • 我之前尝试过,它仍然很慢,因为我正在执行 +200,000 次交易。这需要几个小时,因为现在所有关系都必须与节点创建分开创建,因此必须进行大量 MATCH 查询
    • 你真的试过了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 2014-07-31
    相关资源
    最近更新 更多