Powinieneś mieć do czynienia z dużym plikiem ze strumieniami.
Oto możliwe rozwiązanie:
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);
};
});
Uwaga:
- że używamy strumienia API
node-csv
, co zapewnia, że dane są przetwarzane w tym samym czasie, gdy plik jest odczytywany:w ten sposób cały plik nie jest odczytywany od razu w pamięci.transform
procedura obsługi jest wykonywana dla każdego rekordu; - że używamy
async.queue
, która jest asynchroniczną kolejką przetwarzania:maksymalnie 5 programów obsługi (finalcollection.insert
) są wykonywane równolegle.
Ten przykład powinien zostać przetestowany, ponieważ nie jestem pewien, czy naprawdę dobrze radzi sobie z przeciwciśnieniem. Ponadto poziom współbieżności kolejki powinien być dostosowany do konkretnej konfiguracji.
Możesz także znaleźć tutaj .