数千のレコードが書き込まれた後、Neo4jはスローダウンします。コミットが遅くなります
クエリを高速化するために2つのインデックスが存在します。 また、EXPLAINを使用して、各クエリが一定の時間プロセスであることを知っています。
indexOrder = schema.indexFor(ORDER)
.on("id")
.create();
indexShop = schema.indexFor(SHOP)
.on("domain")
これは私が使用するクエリです:
private void log() {
try (Transaction tx = graphDb.beginTx()) {
for (Map map : list) {
graphDb.execute(query,
singletonMap("json", map));
}
list = new ArrayList<>();
tx.success();
}
}
そして、私は1kのログを持っているとき、私は上記を呼び出します。ここでは
WITH {json} as log
WITH log.order as order, log.shop as shop
MERGE (s:Shop {domain:shop.domain})
ON CREATE SET s=shop
MERGE (s)-[:Scored]->(r:Order {id:order.id})
ON CREATE SET r=order
は、私がDBに格納それをコミットする方法です。
list.add(map);
count++;
if (count % 1000 == 0) {
log();
System.out.println(count);
}
追加情報:私はこれらの設定の設定を使用します。
.setConfig(GraphDatabaseSettings.pagecache_memory, "512M")
.setConfig(GraphDatabaseSettings.string_block_size, "60")
.setConfig(GraphDatabaseSettings.array_block_size, "300")
そのすべてが1つのトランザクション内で行われたが、その後メモリの問題に実行する場合、このシステムは200Kエントリに動作します。
なぜ、わずか5トランザクション(5kエントリ)がデータベースにコミットされた後、1kエントリ/トランザクションアプローチが停止するのはなぜですか?
問題を解決するにはどうすればよいですか?
はい、それは素晴らしいです! – fodon