2017-01-08 2 views
0

Ich lese erfolgreich m3u8 und TS-Dateien extrahieren und m3u8 lesen und prüfen, ob neuer Indizes geschrieben werden (ts-Dateien) und dann mitKnoten JS Chunk-Dateien als eine Datei ohne Interrupt lesen?

res.write(chunk); 

i-Stream ohne interrupting..it erhalten wird, um Dateien, um zu lesen, dass wurde in m3u8 Datei definiert und alles funktioniert einwandfrei ... aber ich habe ein großes Problem ... mit res.write ich bin, dass meine Chunk ts Dateien von HDD zu RAM gelesen werden und RAM-Auslastung wird jede Sekunde um 1MB so erhöht In ungefähr einer Stunde werde ich in den Speicher kommen ... also ist die Frage, wie kann ich vorher gelesene ts Dateien aus dem RAM löschen, so dass die Speichernutzung immer gleich bleibt?

Ich sehe, dass res.write schreibt in den Speicher, aber löscht nicht alte Daten aus dem Speicher .. und auf diese Weise ist nicht praktikabel und wird aus dem Speicher Fehler.Kann ich für res.write Puffergröße so verwenden, wenn Puffer Größe wird voll automatisch aus dem Speicher gelöscht und nächste Chunk-Daten zum RAM lesen? Hier

ist der Code:

fs.readFile('/tmp/files/'+ts[ts.length-2], function (err, data) { 
    res.write(data); 
    /* HERE I NEED TO CLEAR DATA BUFFER CHUNK FROM MEMORY */ 
}); 

So las ich 1000 Dateien in Schleife (kleine Stücke) und schreiben Sie es auf Antwort auf Client ... dies ohne Unterbrechung hervorragende funktioniert ... aber die Speichernutzung ist Datei Größe gelesen auf HDD so RAM-Nutzung wächst ... Wie kann ich Daten aus dem Speicher löschen, nachdem sie an den Client gesendet werden?

+0

'combined-stream' könnte hier helfen: https://www.npmjs.com/package/combined-stream – TMG

+0

danke ... aber das ist nicht, was ich brauche ... ich habe ffmpeg, das macht m3u8 Datei mit indizierten innerhalb (1_0.ts, 1_1.ts ...) und ist im laufenden Betrieb erfrischend ... ich lese m3u Datei und Holen Sie sich diese Indizes out..so ich muss stremam Datei ohne unterbrechung ... siehe apple hls streaming ... – user2631534

+0

Wie ist 'combined-Stream' erfüllt nicht Ihre Anforderungen? – jcaron

Antwort

1

fand ich endlich solution..i müssen nur hinzufügen, wenn ich meine test.js auf Knoten ausgeführt:

node --expose-gc test.js 

Und bevor aus einer Datei auf der Festplatte zu lesen Strom i hinzugefügt:

global.gc(); 

Auf diese Weise global.gc(); wenn Releases alle Speicher ausführen, die von der Funktion fs.filereadsync gelesen wird ... so sieht mein Code wie folgt aus:

global.gc(); 
fs.readFile('/tmp/files/'+ts[ts.length-2], function (err, data) { 
    res.write(data); 

});

Auf diese Weise ... RAM-Nutzung beim Start Knoten JS ist die gleiche die ganze Zeit ... es kommt nicht darauf an, wie Datei Chunk ist groß ... es liest große Datei in den Speicher .. und beim erneuten Aufruf dieses Funktion gibt es RAM zum Starten des Status und lesen Sie eine andere Chunk-Datei im RAM und so in der Schleife ...