Je moet omgaan met een groot bestand met streams.
Hier is een mogelijke oplossing:
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);
};
});
Let op:
- dat we de stream-API van
node-csv
gebruiken , die ervoor zorgt dat de gegevens tegelijkertijd worden verwerkt als het bestand wordt gelezen:op deze manier wordt niet het hele bestand in één keer in het geheugen gelezen. Detransform
handler wordt uitgevoerd voor elk record; - dat we
async.queue
gebruiken , wat een asynchrone verwerkingswachtrij is:maximaal 5 handlers (finalcollection.insert
) worden parallel uitgevoerd.
Dit voorbeeld moet worden getest, omdat ik niet echt zeker weet of het de tegendruk echt goed aankan. Ook moet het gelijktijdigheidsniveau van de wachtrij worden aangepast aan uw specifieke configuratie.
Je kunt hier ook een werkende kern vinden .