MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Einfügen großer CSVs in MongoDB mit Node.js und async.queue

Sie sollten mit einer großen Datei mit Streams umgehen.

Hier ist eine mögliche Lösung:

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);
    };
});

Bitte beachten:

  • dass wir die Stream-API von node-csv verwenden , wodurch sichergestellt wird, dass die Daten gleichzeitig mit dem Lesen der Datei verarbeitet werden:Auf diese Weise wird nicht die gesamte Datei auf einmal in den Speicher gelesen. Die transform Handler wird für jeden Datensatz ausgeführt;
  • dass wir async.queue verwenden , die eine asynchrone Verarbeitungswarteschlange ist:höchstens 5 Handler (finalcollection.insert ) werden parallel ausgeführt.

Dieses Beispiel sollte getestet werden, da ich mir nicht sicher bin, ob es wirklich gut mit Gegendruck umgeht. Außerdem sollte die Gleichzeitigkeitsstufe der Warteschlange an Ihre spezifische Konfiguration angepasst werden.

Eine funktionierende Zusammenfassung finden Sie auch hier .