Você deve lidar com um arquivo grande com fluxos.
Aqui está uma possível solução:
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);
};
});
Observe:
- que usamos a API de stream de
node-csv
, que garante que os dados sejam processados ao mesmo tempo em que o arquivo é lido:dessa forma, o arquivo inteiro não é lido na memória de uma só vez. Atransform
manipulador é executado para cada registro; - que usamos
async.queue
, que é uma fila de processamento assíncrona:no máximo 5 manipuladores (finalcollection.insert
) são executados em paralelo.
Este exemplo deve ser testado, pois não tenho certeza se ele lida muito bem com a pressão de retorno. Além disso, o nível de simultaneidade da fila deve ser ajustado à sua configuração específica.
Você também pode encontrar um gist de trabalho aqui .