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. Latransformel 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í .