sql >> Databasteknik >  >> NoSQL >> MongoDB

Infogar stora CSV:er i MongoDB med Node.js och async.queue

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 .




  1. Skriv på Slave redis db

  2. Genererar Mongo ObjectId (_id) med anpassad tid?

  3. hur kan jag ansluta till en mongodb från Ruby code?

  4. Hur man ställer in hanterare i RedMQ från händelser som tagits upp i min domän