1

非常に大きな csv データをロードするための簡単な ruby​​ ルーチンを作成しました。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 に答える