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