0

ノードを挿入するプロセスを高速化するために、Neo4j で独自のプラグインを開発しました。主な理由は、ノードとリレーションシップが存在しない場合にのみノードとリレーションシップを挿入する必要があり、REST API を使用すると遅すぎる可能性があるためです。

プラグインを 100 回呼び出して、毎回約 100 個のノードと 100 個の関係を挿入しようとすると、呼び出しごとに約 350 ミリ秒かかります。ロックの原因を除外するために、各呼び出しは異なるノードを挿入しています。

ただし、呼び出しを並列化すると (一度に 2、3、4...)、応答時間は並列度に応じて低下します。一度に 2 つの呼び出しを行うと 200 個のオブジェクトを挿入するのに 750 ミリ秒かかり、3 回行うと 1000 ミリ秒かかります。

HttpWebRequest を使用して、.NET MVC コントローラーからプラグインを呼び出しています。maxConnection を 10000 に設定すると、すべての TCP 接続が開いていることがわかります。

この問題について少し調査しましたが、非常に間違っているようです。neo4j 構成またはプラグイン コードで何か間違ったことをしたに違いありません。VisualVM を使用すると、呼び出しを処理するために Neo4j によって起動されたスレッドが順次動作していることがわかりました。リンクされた画像を参照してください。

http://i.imgur.com/vPWofTh.png

私のconf:Windows 8、RAM Neo4j 2.0M03の2コア8G、confチューニングなしのサービスとしてインストール

誰かが私を助けてくれることを願っています。このままでは、Neo4j を本番環境で使用することはできません。ここでは、数十の同時呼び出しがあり、連続して実行することはできません。

4

1 に答える 1

1

Neo4j はトランザクションです。すべてのコミットは、同期ブロックで実行する必要があるファイルシステムで IO 操作をトリガーします。これは、添付した図を説明しています。したがって、シングル スレッドで書き込みを実行することをお勧めします。もちろん、前処理の事前処理は並列化の恩恵を受けることができます。

一般に、最大のパフォーマンスを得るには、安定版 (現在は 1.9.2) を使用してください。初期のマイルストーン ビルドはまだ最適化されていないため、間違ったイメージを抱く可能性があります。

考慮すべきもう 1 つの点は、プラグインで使用されるトランザクション サイズです。1 回のトランザクションで 10,000 から 50,000 が最良の結果をもたらします。トランザクションが非常に小さい場合、トランザクションのオーバーヘッドが大きくなり、巨大なトランザクションの場合、大量のメモリが必要になります。

書き込みパフォーマンスは、基礎となる IO サブシステムのパフォーマンスによって大きく左右されます。可能であれば、高速の SSD ドライブを使用してください。

于 2013-07-19T10:33:34.810 に答える