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