sql >> Base de Datos >  >> NoSQL >> MongoDB

Insertar archivos CSV grandes en MongoDB con Node.js y async.queue

Deberías lidiar con un archivo grande con flujos.

Aquí hay una posible solución:

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

Tenga en cuenta:

  • que usamos la API de transmisión de node-csv , lo que garantiza que los datos se procesen al mismo tiempo que se lee el archivo:de esta manera, no se lee todo el archivo en la memoria a la vez. La transform el controlador se ejecuta para cada registro;
  • que usamos async.queue , que es una cola de procesamiento asíncrono:como máximo 5 controladores (finalcollection.insert ) se ejecutan en paralelo.

Este ejemplo debe probarse, ya que no estoy seguro de que maneje muy bien la contrapresión. Además, el nivel de simultaneidad de la cola debe ajustarse a su configuración específica.

También puede encontrar un aquí .