neo4j 3.1.0エンタープライズ版を使用していました。私のグラフの主な論理は:「IP」ノードと「ユーザー」ノードがあり、どちらも「ユニーク」な制約があります。ユーザーがログインするたびに、IPからユーザーに関係を追加します。ここでNeo4jはトランザクションの並行性が高く、かなり遅くなります
は私の挿入サイファーです:
MERGE (i:IP {ip:"1.2.3.4"})
MERGE (u:User {username:"[email protected]"})
MERGE (i) - [l:SUCC] -> (u)
SET i:ExpireNode, i.expire={expire}
SET u:ExpireNode, u.expire={expire}
SET l.expire={expire}, l.login={login}
挿入が始まりとしてはかなり速いです。しかし、ノードの数が何百万に増えた場合、ノードと関係を挿入するのに非常に時間がかかり、時には1秒以上かかってしまいます。
どうすれば最適化できますか?私はneo4jを12コアのCPUと64Gのメモリで動かしていました。最初のヘッドサイズは16Gで、ページキャッシュは30Gです。
---------------------------------------------- ----------------
ウェブUIで同じサイファーをテストしましたが、コマンドで10ミリ秒かかりました。しかし、javaドライバを使うと、1秒以上かかることがあります。以下は私のJavaコードです:
try (Transaction tx = session.beginTransaction()) {
for (Login login : loginList) {
Value value = login2Operation(login);
tx.run(INSERT_COMMANDS_SUCC, value);
}
tx.success();
}
------------------------------------- -------------------------
いくつかの調査の後、5スレッドで実行すると挿入速度が大幅に向上することがわかりました。しかし、全体的な速度が遅すぎるので、100スレッドに増やす必要があります。その後、各速度のインサート1つが1に増えます。だから、私はNeo4jの並列能力に問題があると信じています。
neo4j.confには、dbms.threads.worker_count=200
が追加されました。しかし、それは助けにはならない。何か案は?
で詳細を見ますか? – InverseFalcon
@InverseFalcon良い点!私はNeo4jウェブUIでコマンドを試してみたところ、10msしかかかりませんでした。しかし、neo4j-java-driverを使うと1秒以上かかるようです。私は問題は、Javaドライバのためだと思いますか?詳細についてはJavaコードを追加しました –
[Michael Hungerのヒントと秘訣](http://jexp.de/blog/2017/03/5-tips-tricks-for-fast-batched-updates-of -graph-structures-with-neo4j-and-cypher /#_ unwind_to_the_res_create)を使用して、バッチおよび挿入を行います。 forループで操作を実行するのではなく、関連するすべてのパラメーターをリストに収集してから、1回の実行呼び出しを実行し、実行時に収集をアンワインドして変更を一度に適用する必要があります。 – InverseFalcon