Vous devriez traiter un gros fichier avec des flux.
Voici une solution possible :
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);
};
});
Veuillez noter :
- que nous utilisons l'API de flux de
node-csv
, ce qui garantit que les données sont traitées en même temps que le fichier est lu :de cette façon, tout le fichier n'est pas lu en mémoire d'un seul coup. Latransform
le gestionnaire est exécuté pour chaque enregistrement ; - que nous utilisons
async.queue
, qui est une file d'attente de traitement asynchrone :au plus 5 gestionnaires (finalcollection.insert
) sont exécutés en parallèle.
Cet exemple devrait être testé, car je ne suis pas vraiment sûr qu'il gère très bien la contre-pression. En outre, le niveau de simultanéité de la file d'attente doit être ajusté à votre configuration spécifique.
Vous pouvez également trouver un l'essentiel de travail ici .