2016-06-20 4 views
0

私はかなり大きなデータセット、約6800万データポイントを持っています。データは現在MongoDBに保存されており、データポイントをリンクしてCypherコマンドを使用してNeo4jデータベースに配置するためのデータを処理するJavaプログラムを作成しました。私はこのプログラムをテストセットのデータ(〜150万)で実行し、それは一晩中実行しました。今では、データセット全体をインポートしようとすると、プログラムは非常に遅いです。週末全体を回って、わずか35万データポイントしか作れませんでした。短いテストを通して、Neo4jがボトルネックになっているようです。 Javaプログラムを停止してから30分ほど経ちましたが、Neo4jのCPU使用率は100%で、新しいノードは(Javaプログラムから)追加されています。このボトルネックを乗り越えるためにとにかくありますか?私はマルチスレッドについて考えましたが、ネットワークを作成しようとしているので、多くの依存関係やスレッドセーフでない操作が実行されています。ご協力いただきありがとうございます!大規模なデータセットをNeo4jにインポートするのが極端に遅い

EDIT:私が持っているデータは、ユーザーのリストです。含まれるデータは、ユーザーIDと、ユーザーの友人IDの配列です。私のサイファーのクエリは、このように少し見える: "u:USER {id:" + currentID + "}) CREATE (u)-[:FRIENDS {ts:" + timeStamp}]->(u" + connectionID + ":USER {id:" + connectionID + "})" 申し訳ありませんが、これはこの

+0

いくつかの例のクエリを共有できますか。 MERGEまたはMATCHを使用する場合は、それらのLabel +プロパティの組み合わせに対してインデックスまたはより優れた制約があることを確認してください。 –

+0

私はあなたがjava neo4j apiを使うべきであると思う。これははるかに速い。暗号化クエリを翻訳する必要があります。 – Mvde

答えて

1

にかなり新しい、本当にひどいです場合は、最初にこれを見てください。

neo4j import slowing down

あなたはまだDIYに決定した場合は、最初に、1つのトランザクションですべてのデータをインポートしようとしないようにしてください。そうしないと、ガベージコレクタによって中断されたコードのほとんどがコードで消費されます。次に、Neo4jプロセス(またはNeo4jの埋め込みインスタンスを使用している場合はアプリケーション)に十分なメモリを確保してください。 Neo4jでは6,800万ノードが自明ではありませんが、生成しているCypherが常に最高のものを探しているとします。新しい関係を作成すると、十分なメモリを割り当てなければ、重大なページングの問題が発生します。あなたがプロパティ(というよりIDによる)によって、ノードを探している場合は最後に、あなたは、ラベルとスキーマのインデックス使用する必要があります。

http://neo4j.com/news/labels-and-schema-indexes-in-neo4j/

1

をあなたはneo4j.propertiesとのNeo4j-のwrapper.confファイルを設定しましたか? マシンで使用可能なRAMの量に応じて値を調整することを強くお勧めします。私は通常、12ギガバイトのRAMサーバー用に私が

dbms.pagecache.memory=8000 

輸入に完全例えばhttp://neo4j.com/blog/import-10m-stack-overflow-questions/を参照してくださいを設定のconf/neo4j.propertiesで

wrapper.java.initmemory=8000 
wrapper.java.maxmemory=8000 

を使用するのconf /のNeo4j-のwrapper.confで

数分で10Mのノード、それは良い出発点です

SSDのインポートを高速化することもお勧めします。

0

バルクデータをデータベースにロードする際に私が学んだことの1つは、宛先テーブルでインデックスを一時的にオフにすることでした。それ以外の場合は、新しいレコードが追加されるたびに索引が別々に更新され、のロット番号がディスク上に作成されます。データロードが完了した後、別の操作でテーブル全体を再インデックスする方がはるかに迅速でした。 YMMV。

関連する問題