Měli byste se zabývat velkým souborem s proudy.
Zde je možné řešení:
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);
};
});
Poznámka:
- že používáme stream API
node-csv
, který zajišťuje, že data jsou zpracovávána současně s načítáním souboru:tímto způsobem není celý soubor načten v paměti najednou.transform
handler se provede pro každý záznam; - že používáme
async.queue
, což je asynchronní fronta zpracování:maximálně 5 obslužných rutin (finalcollection.insert
) se provádějí paralelně.
Tento příklad by měl být otestován, protože si opravdu nejsem jistý, zda zvládá protitlak opravdu dobře. Také úroveň souběžnosti fronty by měla být přizpůsobena vaší konkrétní konfiguraci.
Můžete také najít funkční souhrn zde .