sql >> Database >  >> NoSQL >> MongoDB

Grote CSV's in MongoDB invoegen met Node.js en async.queue

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. De transform 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 .




  1. Een MongoDB opvragen op basis van Mongo ID in een node.js-app

  2. Hoe krijg ik afdrukuitvoer voor het debuggen van kaart / verkleinen in Mongoid?

  3. Spring boot caching met redis, key have \xac\xed\x00\x05t\x00\x06

  4. Hoe controleer ik of een document is ingevoegd of bijgewerkt bij gebruik van findOneAndUpdate?