Du bør håndtere en stor fil med streams.
Her er en mulig 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);
};
});
Bemærk venligst:
- at vi bruger stream-API'et for
node-csv
, som sikrer, at dataene behandles samtidig med, at filen læses:på denne måde læses hele filen ikke i hukommelsen på én gang.transform
handler udføres for hver post; - at vi bruger
async.queue
, som er en asynkron behandlingskø:højst 5 behandlere (finalcollection.insert
) udføres parallelt.
Dette eksempel bør testes, da jeg ikke rigtig er sikker på, at den håndterer modtryk rigtig godt. Samtidig skal køens samtidighedsniveau justeres til din specifikke konfiguration.
Du kan også finde en arbejdsindsats her .