Bạn nên xử lý một tệp lớn bằng các luồng.
Đây là một giải pháp khả thi:
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);
};
});
Xin lưu ý:
- rằng chúng tôi sử dụng API luồng của
node-csv
, điều này đảm bảo rằng dữ liệu được xử lý cùng lúc khi tệp được đọc:theo cách này, toàn bộ tệp không được đọc trong bộ nhớ cùng một lúc.transform
trình xử lý được thực thi cho mỗi bản ghi; - mà chúng tôi sử dụng
async.queue
, là hàng đợi xử lý không đồng bộ:tối đa 5 trình xử lý (finalcollection.insert
) được thực hiện song song.
Ví dụ này nên được thử nghiệm, vì tôi không thực sự chắc chắn rằng nó xử lý áp lực ngược thực sự tốt. Ngoài ra, mức đồng thời của hàng đợi phải được điều chỉnh theo cấu hình cụ thể của bạn.
Bạn cũng có thể tìm thấy ý chính hoạt động tại đây .