Du bör ta itu med en stor fil med strömmar.
Här är en möjlig lösning:
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);
};
});
Observera:
- att vi använder stream-API:et för
node-csv
, som säkerställer att data bearbetas samtidigt som filen läses:på detta sätt läses inte hela filen i minnet på en gång.transform
hanteraren exekveras för varje post; - att vi använder
async.queue
, som är en asynkron bearbetningskö:högst 5 hanterare (finalcollection.insert
) exekveras parallellt.
Det här exemplet bör testas, då jag inte är riktigt säker på att den klarar mottryck riktigt bra. Dessutom bör samtidighetsnivån för kön justeras till din specifika konfiguration.
Du kan också hitta en arbetsförklaring här .