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