जैसा कि रोबी ने कहा, धाराएं इसके साथ जाने का रास्ता हैं। fs.createReadStream()
.readFileSync()
के बजाय इस्तेमाल किया जाना चाहिए . मैं एक लाइन रीडर बनाने के साथ शुरू करूंगा जो पथ लेता है और जो भी स्ट्रिंग/रेगेक्स आप विभाजित करना चाहते हैं:
linereader.js
var fs = require("fs");
var util = require("util");
var EventEmitter = require("events").EventEmitter;
function LineReader(path, splitOn) {
var readStream = fs.createReadStream(path);
var self = this;
var lineNum = 0;
var buff = ""
var chunk;
readStream.on("readable", function() {
while( (chunk = readStream.read(100)) !== null) {
buff += chunk.toString();
var lines = buff.split(splitOn);
for (var i = 0; i < lines.length - 1; i++) {
self.emit("line",lines[i]);
lineNum += 1;
}
buff = lines[lines.length - 1];
}
});
readStream.on("close", function() {
self.emit("line", buff);
self.emit("close")
});
readStream.on("error", function(err) {
self.emit("error", err);
})
}
util.inherits(LineReader, EventEmitter);
module.exports = LineReader;
यह एक टेक्स्ट फ़ाइल पढ़ेगा, और प्रत्येक पंक्ति पढ़ने के लिए "लाइन" ईवेंट उत्सर्जित करेगा, इसलिए आपके पास उन सभी को एक बार में स्मृति में नहीं रखा जाएगा। फिर, async पैकेज (या जो भी async लूप आप उपयोग करना चाहते हैं) का उपयोग करके, प्रत्येक दस्तावेज़ को सम्मिलित करने वाली फ़ाइलों के माध्यम से लूप करें:
app.js
var LineReader = require("./linereader.js");
var async = require("async");
var paths = ["./text1.txt", "./text2.txt", "./path1/text3.txt"];
var reader;
async.eachSeries(paths, function(path, callback) {
reader = new LineReader(path, /\n/g);
reader.on("line", function(line) {
var doc = turnTextIntoObject(line);
db.collection("mycollection").insert(doc);
})
reader.on("close", callback);
reader.on("error", callback);
}, function(err) {
// handle error and finish;
})