आपको स्ट्रीम के साथ एक बड़ी फ़ाइल से निपटना चाहिए।
यहां एक संभावित समाधान है:
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);
};
});
कृपया ध्यान दें:
- कि हम
node-csv
के स्ट्रीम API का उपयोग करते हैं , जो सुनिश्चित करता है कि डेटा को उसी समय संसाधित किया जाता है जब फ़ाइल पढ़ी जाती है:इस तरह पूरी फ़ाइल एक बार में मेमोरी में नहीं पढ़ी जाती है।transform
प्रत्येक रिकॉर्ड के लिए हैंडलर निष्पादित किया जाता है; - कि हम
async.queue
का उपयोग करते हैं , जो एक अतुल्यकालिक प्रसंस्करण कतार है:अधिकतम 5 हैंडलर (finalcollection.insert
) ) समानांतर में निष्पादित होते हैं।
इस उदाहरण का परीक्षण किया जाना चाहिए, क्योंकि मुझे वास्तव में यकीन नहीं है कि यह वास्तव में पीठ के दबाव को अच्छी तरह से संभालता है। साथ ही, कतार के समवर्ती स्तर को आपके विशिष्ट कॉन्फ़िगरेशन में समायोजित किया जाना चाहिए।
आप एक कार्य सार भी पा सकते हैं। ।