Anda harus berurusan dengan file besar dengan aliran.
Berikut adalah solusi yang mungkin:
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);
};
});
Harap diperhatikan:
- bahwa kami menggunakan API aliran
node-csv
, yang memastikan bahwa data diproses pada saat yang sama saat file dibaca:dengan cara ini seluruh file tidak dibaca dalam memori sekaligus.transform
handler dieksekusi untuk setiap record; - bahwa kami menggunakan
async.queue
, yang merupakan antrian pemrosesan asinkron:paling banyak 5 penangan (finalcollection.insert
) dijalankan secara paralel.
Contoh ini harus diuji, karena saya tidak begitu yakin bahwa itu menangani tekanan balik dengan sangat baik. Selain itu, tingkat konkurensi antrian harus disesuaikan dengan konfigurasi spesifik Anda.
Anda juga dapat menemukan inti yang berfungsi di sini .