@feathers/mongodb を使用して、csv ファイルから mongo に 500k のエントリをロードしています。
フックでは、すべての行を収集し、それらを少し操作して、配列全体を挿入します
let data_to_insert = [];
let element = function () {
this.member1 = '';
this.member2 = '';
this.member3 = '';
this.member4 = '';
this.member5 = '';
this.member6 = '';
};
// Read File
let content = await csv({
delimiter: ';',
})
.fromFile(pathCsv) // 120MB file, 500k entries
.subscribe((line) => {
let t_elem = new element();
t_elem.member1 = roundMinutes(line.member1); //returns date
t_elem.member2 = line.member2;
t_elem.member3 = line.member3;
t_elem.member4 = line.member4;
t_elem.member5 = new Date(
+line.member5 * 1000,
); // JS: timestamp * 1000
t_elem.member6 = new Date(
+line.member6 * 1000,
);
data_to_insert.push(t_elem);
});
// store the list
context.app.service('api/myservice').create(data_to_insert);
// all entries are written in the db. Heap grows afterwards
return;
モンゴへ。それは完全に機能し、データは約 10 秒でデータベースに書き込まれます。
しかし、pm2 で、ヒープが最大 8GB まで大きくなり、プロセスがメモリ不足になることに気付きました。後からどうしてこうなったのか気になります。これは、トリガーされる 500k create イベントに関連していますか?
chrome devtools を使用したスナップショット:
特にストリングスは巨大です。それらを確認すると、ほとんどのメモリを消費する「イベント文字列」がいくつか表示されます。
フックを再度呼び出そうとすると、スタックします。私 (または PM2) は、プロセスを再起動して、再度実行する必要があります。
PM2 | [PM2][WORKER] Process 0 restarted because it exceeds --max-memory-restart value (current_memory=8904929280 max_memory_limit=8589934592 [octets])
PM2 | Process 0 in a stopped status, starting it
PM2 | Stopping app:Collector id:0
PM2 | pid=53621 msg=failed to kill - retrying in 100ms
PM2 | pid=53621 msg=failed to kill - retrying in 100ms
PM2 | pid=53621 msg=failed to kill - retrying in 100ms
PM2 | pid=53621 msg=failed to kill - retrying in 100ms
PM2 | pid=53621 msg=failed to kill - retrying in 100ms
PM2 | pid=53621 msg=failed to kill - retrying in 100ms
PM2 | pid=53621 msg=failed to kill - retrying in 100ms
PM2 | pid=53621 msg=failed to kill - retrying in 100ms
PM2 | pid=53621 msg=failed to kill - retrying in 100ms
PM2 | App [Collector:0] exited with code [0] via signal [SIGINT]
PM2 | pid=53621 msg=process killed
PM2 | App [Collector:0] starting in -fork mode-
これがイベントに関連している場合、この種の挿入に対してこれを無効にする方法は? そうでない場合、このヒープの肥大化を回避するために、このコードで何を最適化する必要がありますか?
ご協力いただきありがとうございます。