Ich lese eine 45Mb Textdatei in NodeJS und einige Verarbeitung für jedes Zeichen darauf.Warum verursacht ein Nodejs Write Stream einen zunehmenden Speicherverbrauch?
Die erste Version meines Skripts nahm ein Zeichen aus der ursprünglichen Datei, speichert es in einer Akkumulatorvariablen (Ergebnis + = char) und speichert dann das Ergebnis in einer Textdatei. Dies funktioniert nicht, da die Datei so groß war, dass ich zu viele Daten in den RAM speicherte. Daher habe ich einen Fehler bekommen: Javascript Heap out of memory. Ich beschloss, einen Schreibstrom zu verwenden, so dass ich die Daten direkt auf der Festplatte einen Chat zu der Zeit schreiben kann, so das das Problem lösen könnte:
fs = require('fs');
var proportion = 2;
var c = '';
fs.readFile('./concat/all.txt', 'utf8', function (err,data) {
if (err) {
return console.log(err);
}
var h = parseInt(Math.sqrt(data.length/proportion));
var w = parseInt(h * proportion);
console.log(w, h);
var wstream = fs.createWriteStream('output.txt');
var lineCount = 0;
for(var x = 0; x < data.length; x++) {
if(data.charCodeAt(x) === 32 && x > 0 && data.charCodeAt(x - 1) === 32)
continue;
if(data.charCodeAt(x) === 10 && x > 0 && data.charCodeAt(x - 1) === 10)
continue;
c = (data.charCodeAt(x) === 10 || data.charCodeAt(x) === 13 || data.charCodeAt(x) === 9) ? " " : data.charAt(x);
lineCount++;
if(lineCount > w) {
c += "\n";
lineCount = 0;
}
wstream.write(c);
}
wstream.end();
});
Aber immer noch, ich bin nicht genügend Arbeitsspeicher Fehler. Das Skript läuft ohne Probleme, wenn ich wstream.write(c)
kommentiere. Warum?
ich denke, da Ihre for-Schleife endet in vielleicht 1 Sekunde und das Schreiben dauert immer noch 100 Sekunden. also im Grunde ist es immer noch alles in Erinnerung ... Sie müssen Ihre 'wstream.write (c);' -Aufrufe verlangsamen. –
... ich würde sogar sagen, das erste Zeichen wird nur geschrieben, nachdem Sie Ihren ReadFile-Callback beendet haben. und davor werden alle Daten, die Sie schreiben möchten, im Speicher zwischengespeichert. –
Also? Ist meine Lösung wie ** Crossplatform **? – EMX