Come ha detto Robbie, gli stream sono la strada da percorrere con questo. fs.createReadStream()
dovrebbe essere usato al posto di .readFileSync()
. Inizierei con la creazione di un lettore di riga che prenda un percorso e qualsiasi stringa/espressione regolare su cui desideri dividere:
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;
Questo leggerà un file di testo ed emetterà eventi "linea" per ogni riga letta, quindi non li avrai tutti in memoria contemporaneamente. Quindi, utilizzando il pacchetto asincrono (o qualsiasi ciclo asincrono che desideri utilizzare), scorre i file inserendo ogni documento:
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;
})