私たちの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
ありがとう。
これは、スキーマとスクリプトがどのように見えるか、特にインデックスの使い方が分からなければ、わかりにくいです。一般的には、私はラップトップで1秒間に6kノードと27kの関係(それに3つのプロパティを持つ)の書き込みスループットを持っているので、サーバーの前で最初にクエリとスクリプトを調べる余裕があります。 –
py2neo 'transaction = graph.begin()/ node =ノード()/ transaction.merge(ノード)/ transaction.commit()'私たちのスキーマは、各抽象クラスから他の5ノードまでの関係を持つ抽象クラスごとに6つのノードです。私たちは、遅い摂取率のデモを設定し、分析に役立てるためにここに投稿しようとします。 – Saoirse
6ノードで6回これを行うと教えてください。 –