0

@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-

これがイベントに関連している場合、この種の挿入に対してこれを無効にする方法は? そうでない場合、このヒープの肥大化を回避するために、このコードで何を最適化する必要がありますか?

ご協力いただきありがとうございます。

4

1 に答える 1