【问题标题】:Reading lots of csv data into neo4j using execute_query, ruby and neography使用execute_query、ruby和neography将大量csv数据读入neo4j
【发布时间】:2014-08-13 20:48:44
【问题描述】:

我编写了一个快速的 ruby​​ 例程来加载一些非常大的 csv 数据。我对尝试使用 load_csv 的各种内存不足问题感到沮丧,因此恢复为 ruby​​。我对 neo4j 比较陌生,所以尝试使用 Neography 来调用我创建为字符串的密码查询。

密码代码正在使用合并来添加 2 个现有节点之间的关系:

cmdstr=match (a:Provider {npi: xxx}),(b:Provider {npi:yyy}) merge (a)-[:REFERS_TO {qty: 1}]->(b);

@neo.execute_query(cmdstr)

我只是在运行这些文件的文件中循环遍历这些行。它在大约 30000 行后失败,并出现套接字错误“无法分配请求的地址”。我相信 GC 在某种程度上引起了问题。然而,日志并没有告诉我任何事情。我尝试过以不同方式调整 GC,并尝试不同数量的堆。每次都在同一个地方失败。任何帮助表示赞赏。

[编辑] 更多信息 - 运行 netstat --inet 显示数千个到 localhost:7474 的连接。 execute_query 是否没有按设计重用连接,还是这是一个问题?

我现在已经尝试过参数并且行为是相同的。您将如何使用批处理对此类查询进行编码并确保使用 npi 上的索引?

【问题讨论】:

    标签: ruby csv neo4j neography


    【解决方案1】:

    我终于能够通过将 MERGE 更改为 CREATE(首先删除所有关系)来使其工作。仍然需要很长时间,但它与关系数量保持线性关系。

    我还将垃圾收集从 Concurrent/Sweep 更改为 parallelGC。无论如何,并发扫描都会失败并恢复为完整的 GC。

    #wrapper.java.additional=-XX:+UseConcMarkSweepGC wrapper.java.additional=-XX:+UseParallelGC wrapper.java.additonal=-XX:+UseNUMA wrapper.java.additional=-XX:+CMSClassUnloadingEnabled wrapper.java.additional=-Xmn630m

    【讨论】:

      【解决方案2】:

      使用 Neo4j 2.1.3 解决了 LOAD CSV 问题:

      USING PERIODIC COMMIT 1000
      LOAD CSV WITH HEADERS FROM "http://npi_data.csv" as line
      MATCH (a:Provider {npi: line.xxx})
      MATCH (b:Provider {npi: line.yyy}) 
      MERGE (a)-[:REFERS_TO {qty: line.qty}]->(b);
      

      在您的 ruby​​ 代码中,您应该使用 Cypher 参数,并且可能使用 transactional API。 您是否以某种方式限制请求的并发性(例如单个客户端)?

      还要确保为您的提供者创建索引或约束:

       create index on :Provider(npi);
      

       create constraint on (p:Provider) assert p.npi is unique;
      

      【讨论】:

      • 感谢您的回答。我正在使用 2.1.3。我正在尝试加载大约 154M 的关系,每个关系大约有 4 个属性,但我还没有找到一个似乎运作良好的策略。在neography 中尝试参数会引发错误,提示您不能将参数msps 与MERGE 一起使用。
      • 另外,上面的代码就是我正在做的。大约 5 分钟后,它会因巨大的 GC 时间而陷入困境。我已经花费了很多时间来玩不同的 GC 和内存设置。加载这些数据似乎只需要几天时间。
      • 此外,即使使用参数运行 neography 也会在大约 25k 行后出现套接字错误。 /var/lib/gems/1.9.1/gems/excon-0.39.4/lib/excon/socket.rb:187:in `connect_nonblock': 无法分配请求的地址 - connect(2) (Errno::EADDRNOTAVAIL) ( Excon::Errors::SocketError)
      猜你喜欢
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      相关资源
      最近更新 更多