1

我写了一个快速的 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 上的索引?

4

2 回答 2

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

于 2014-08-22T00:25:38.950 回答
0

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 参数和可能的事务 API。您是否以某种方式限制请求的并发性(例如单个客户端)?

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

 create index on :Provider(npi);

或者

 create constraint on (p:Provider) assert p.npi is unique;
于 2014-08-16T20:14:22.200 回答