MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Inserimento di CSV di grandi dimensioni in MongoDB con Node.js e async.queue

Dovresti gestire un file di grandi dimensioni con gli stream.

Ecco una possibile soluzione:

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);
    };
});

Si prega di notare:

  • che utilizziamo l'API stream di node-csv , che garantisce che i dati vengano elaborati contestualmente alla lettura del file:in questo modo l'intero file non viene letto in memoria in una sola volta. La transform handler viene eseguito per ogni record;
  • che utilizziamo async.queue , che è una coda di elaborazione asincrona:al massimo 5 gestori (finalcollection.insert ) vengono eseguiti in parallelo.

Questo esempio dovrebbe essere testato, poiché non sono davvero sicuro che gestisca molto bene la contropressione. Inoltre, il livello di concorrenza della coda dovrebbe essere adattato alla tua configurazione specifica.

Puoi anche trovare un qui .