5

最近、Neo4j を 3.1.3 にアップグレードし、それと同時に最新の APOC プラグイン (3.1.3.6) を入手しました。

正常に動作するコードが少しあり、約 1 分半の壁時間で最大 300 万の関係を作成できました。しかし、今では8時間以上稼働しており、止まる気配はありません...

コードは以前は問題なく実行されていたので、バージョン間で何かが変更されて、コードが機能しなくなったことを願っています。

rock_n_roll変更する必要があるのは(おそらくapoc.periodic.commit位置引数などで)ですか?洞察をありがとう。

これが私が実行しているものです。

CALL apoc.periodic.rock_n_roll(
  "MATCH (c:ChessPlayer),(r:Record) WHERE c.ChessPlayer_ID = r.ChessPlayer RETURN c,r",
  "CYPHER planner=rule WITH {c} AS c, {r} AS r CREATE (c)-[:HAD_RECORD]->(r)",
  200000)
4

1 に答える 1

1

私の理解では、呼び出しは ChessPlayers と Records のデカルト積をクエリし、行ごとにフィルター処理して、それらの最終結果をバッチ更新します (これは多くのメモリを消費します。この 1 つの開始トランザクションだと思います)。あなたを殺しているものです)。したがって、各トランザクションができるだけ少ないノードにアクセスできるように分割できれば、パフォーマンスが大幅に向上するはずです (特に、r.ChessPlayer がインデックス化されている場合は、それらすべてをロードする必要がないため)。

CALL apoc.periodic.rock_n_roll(
  "MATCH (c:ChessPlayer) WHERE NOT EXISTS((c)-[:HAD_RECORD]->()) RETURN c",
  "MATCH (r:Record) WHERE c.ChessPlayer_ID = r.ChessPlayer WITH c,r CREATE UNIQUE (c)-[:HAD_RECORD]->(r)",
  100000)

period.commit() も同様の原則で機能します。各トランザクションを小さくする (触れるノードが少ない) ほど、バッチは高速になります。

于 2017-05-19T17:22:42.537 に答える