2016-07-31 30 views
3

Ich möchte Node.js-Modul erstellen, das in der Lage sein soll, riesige Binärdateien (einige größer als 200 GB) zu parsen. Jede Datei ist in Blöcke unterteilt und jeder Block kann größer als 10 GB sein. Ich versuchte, fließende und nicht-fließende Methoden zu verwenden, um Datei zu lesen, aber das Problem liegt daran, dass das Ende des gelesenen Puffers beim Parsen von Chunk erreicht wird, so dass das Parsen dieses Chunks beendet werden muss, bevor das nächste onData Ereignis auftritt. Dies ist, was ich versucht habe:Große Binärdateien in Node.js analysieren

var s = getStream(); 

s.on('data', function(a){ 
    parseChunk(a); 
}); 

function parseChunk(a){ 
    /* 
     There are a lot of codes and functions. 
     One chunk is larger than buffer passed to this function, 
     so when the end of this buffer is reached, parseChunk 
     function must be terminated before parsing process is finished. 
     Also, when the next buffer is passed, it is not the start of 
     a new chunk because the previous chunk is not parsed to the end. 
    */ 
} 

ganze Brocken in Prozessspeicher Laden ist nicht prossible, weil ich nur 8 GB RAM haben. Wie kann ich synchron Daten aus dem Stream lesen oder wie kann ich die Funktion parseChunk anhalten, wenn das Ende des Puffers erreicht ist und warten bis neue Daten verfügbar sind?

+0

Wenn Sie Streams verwenden, schalten Sie das Lesen/Schreiben und Puffern in den Stream um. Aber Sie scheinen genaue Kontrolle darüber zu haben, was genau gelesen wird und wann es gelesen wird. Warum liest du nicht direkt die genaue Anzahl der Bytes, die du selbst lesen willst, ohne einen Stream, den du nicht vollständig kontrollierst? – jfriend00

+0

@ jfriend00. Weil diese Dateien nicht auf meiner Festplatte sein müssen. Stream kann aus der Serverdatei, aus einem Teil des anderen Prozessspeichers oder aus einem Puffer abgerufen werden. –

Antwort

0

Vielleicht vermisse ich etwas, aber soweit ich das beurteilen kann, sehe ich keinen Grund, warum dies nicht mit Streams mit einer anderen Syntax implementiert werden könnte. Ich würde

let chunk; 
let Nbytes; // # of bytes to read into a chunk 
stream.on('readable',()=>{ 
    while(chunk = stream.read(Nbytes)!==null) { 
    // call whatever you like on the chunk of data of size Nbytes 
    } 
}) 

Hinweis verwenden, wenn Sie die Größe des Blockes selbst festlegen, wie hier geschieht, wird null zurückgegeben werden, wenn die Menge an Bytes angefordert am Ende des Stroms nicht zur Verfügung. Dies bedeutet nicht, dass es keine Daten mehr zum Streamen gibt. Beachten Sie also, dass Sie am Ende der Datei ein getrimmtes Pufferobjekt der Größe < Nbytes erwarten können.