MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Insertion de grands fichiers CSV dans MongoDB avec Node.js et async.queue

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. La transform 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 .