2016-04-19 17 views
3

私たちのpy2neoスクリプトは、Neo4Jを使用して1日に約500,000の割合で抄録を取り込みます。比較のため、私たちは1日でSolrに2,000万件の抄録を取り込みます。これがNeo4Jの予測される摂取量であるのか、それともパフォーマンスを向上させるためにできることがあるのか​​と疑問に思っています。摂取速度が遅い

py2neoバージョン2とバージョン3、そしてNeo4J Enterpriseバージョン2と3の組み合わせを試しました。それぞれの組み合わせで、摂取率はほぼ同じです。パフォーマンスを向上させるために、抽象度1000のバッチを使用します。抄録は平均約400〜500語で、適度なプロパティを持つ5つの追加エンティティを作成し、各抄録とエンティティ間の関係を作成します。最初にエンティティをインジェストし、次に関係(create_unique())を使用してサーバへのラウンドトリップ(find()またはfind_one())を回避します。抽象的に1つのノードしか作成されないように、create()よりもmerge()を優先します。私たちはcreate()を試してみましたが、負荷のパフォーマンスはわずかに向上しました。ボトルネックはサーバー側にあるように見えます。私たちのスクリプトは1000回のトランザクションを迅速に作成し、コミット中に遅延があり、トランザクションを処理している間にNeo4Jサーバーからのスローダウンが発生することを示しています。

Neo4Jデータベース全体をワイプしないソリューションが必要です。今後も複数のデータストリームを並行して取り込み、DBを安定させる必要があります。

PythonをJavaよりも優先し、ダイレクトCypherクエリでpy2neoのmerge()/ create()ベースのトランザクションを使用することをお勧めします。

私たちはBoltが私たちにより良いパフォーマンスを与えることを望んでいましたが、現在Boltトランザクションはpy2neo v3/Neo4J 3.0.0 RC1で無期限にハングします。また、HTTPトランザクションのインスタンスもハングアップしていました。

私たちのNeo4Jインスタンスはデフォルト設定を使用しています。

私たちのサーバーは、2プロセッサ、12コア、32GBのメモリを搭載したLinuxホストです。

ロードパフォーマンスを向上させる方法についてのご意見はありますか?わずか数日で2,000万の抄録をNeo4Jに取り込むことができれば壮大になるでしょう。

摂取スクリプトには、1秒あたり54件のエンティティトランザクションのトランザクションレートが表示されます。 54Kではなく54であることに注意してください。

$ python3 neo-ingestion-rate.py 
Number of batches: 8 
Entity transactions per batch: 6144 
Merge entities: 2016-04-22 16:31:50.599126 
All entities committed: 2016-04-22 16:47:08.480335 
Entity transactions per second: 53.5494121750082 
Relationship transactions per batch: 5120 
Merge unique relationships: 2016-04-22 16:47:08.480408 
All relationships committed: 2016-04-22 16:49:38.102694 
Number of transactions: 40960 
Relationship transactions per second: 273.75593641599323 

ありがとう。

+0

これは、スキーマとスクリプトがどのように見えるか、特にインデックスの使い方が分からなければ、わかりにくいです。一般的には、私はラップトップで1秒間に6kノードと27kの関係(それに3つのプロパティを持つ)の書き込みスループットを持っているので、サーバーの前で最初にクエリとスクリプトを調べる余裕があります。 –

+0

py2neo 'transaction = graph.begin()/ node =ノード()/ transaction.merge(ノード)/ transaction.commit()'私たちのスキーマは、各抽象クラスから他の5ノードまでの関係を持つ抽象クラスごとに6つのノードです。私たちは、遅い摂取率のデモを設定し、分析に役立てるためにここに投稿しようとします。 – Saoirse

+0

6ノードで6回これを行うと教えてください。 –

答えて

1

neo4j-shell経由でのロードはどうですか?私はRで自分の仕事の大部分を行い、単純にインポートをスクリプト化します。

Hereは、私がアプローチを概説するブログ記事です。あなたはPythonでそれを鏡にすることができます。

基本的な考え方は、データをディスクに保存し、そのファイルを参照するcypherスクリプトを実行するneo4j-shell経由でロードすることです。

このアプローチは、大きなデータセットを読み込む際に役立つことがわかりました。もちろん、データの密度、データモデルそのもの、適切なインデックスの確立に依存します。

+0

あなたの提案をありがとう。私たちはneo4j-shellを認識していますが、私たちの好みはPythonクラスです。 Neo4Jへの参加に加えて、Elasticssearchにも参加しています。 1つの解決策は、Pythonクラスを保ち、neo4j-shellへのシステムコールを作成することです。理想的ではありませんが、パフォーマンスを向上させる唯一の方法なら、他の選択肢はありません。 – Saoirse

0

このブログ記事は、一括でデータをインポートする方法について説明します。

https://neo4j.com/blog/bulk-data-import-neo4j-3-0/

彼らは「彼らはただドン

3分〜で〜78M関係、〜31M・ノードをインポートすることができるという主張これが実行されているマシン、おそらくクラスターに言及してください。

それでも、観察するよりもはるかに高い摂取率を得ることが可能であることが示されています。

バルーン挿入を本当にしたいときに、Pythonクラスは一度に1つのレコードをインポートする可能性があります。

関連する問題