Jak powiedział Robbie, najlepszym rozwiązaniem są strumienie. fs.createReadStream()
powinno być używane zamiast .readFileSync()
. Zacząłbym od stworzenia czytnika wierszy, który pobiera ścieżkę i dowolny ciąg/wyrażenie regularne, na które chcesz podzielić:
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;
Spowoduje to odczytanie pliku tekstowego i wyemitowanie zdarzeń „line” dla każdej odczytanej linii, więc nie będziesz mieć ich wszystkich w pamięci naraz. Następnie, używając pakietu asynchronicznego (lub dowolnej pętli asynchronicznej, której chcesz użyć), przejdź przez pliki wstawiając każdy dokument:
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;
})