ストリームを含む大きなファイルを処理する必要があります。
考えられる解決策は次のとおりです。
var queue = async.queue(collection.insert.bind(collection), 5);
csv()
.from.path('./input.csv', { columns: true })
.transform(function (data, index, cb) {
queue.push(data, function (err, res) {
if (err) return cb(err);
cb(null, res[0]);
});
})
.on('error', function (err) {
res.send(500, err.message);
})
.on('end', function () {
queue.drain = function() {
res.send(200);
};
});
注意:
-
node-csv
のストリームAPIを使用していること 、これにより、ファイルの読み取りと同時にデータが処理されます。このようにして、ファイル全体がメモリに一度に読み取られることはありません。transform
ハンドラーはレコードごとに実行されます; -
async.queue
を使用する 、これは非同期処理キューです:最大5つのハンドラー(finalcollection.insert
)は並行して実行されます。
この例は、背圧をうまく処理できるかどうかわからないため、テストする必要があります。また、キューの同時実行レベルは、特定の構成に合わせて調整する必要があります。
作業の要点 もここにあります。 。