2016-10-24 4 views
0

Ich versuche, einen lesbaren Stream zu implementieren. Die Datenquelle ist ein Messwerkzeug, das beim Start viele Daten erzeugt. Ich versuche, große Datenmengen in meiner _read (Größe) Implementierung auf einmal zu pushen. Wenn ich die Messung starte und den Stream verschiebe, habe ich schon mehr Daten als der interne Puffer.NodeJS, lesbarer Stream, push große Datenmengen auf einmal

  • Ich versuche, Daten von der gewünschten Größe zu drücken -> Fehler, brauchen sie ein wenig zu reduzieren (in meinem Fall 32)
  • Schon der erste Push erfolgreich ist, ist die Schnittstelle ruft _read (Größe) wieder , wenn ich die angeforderte Größe drücken wollte, bekam ich einen Fehler. Der interne Puffer ist noch voll.
  • Wenn ich den Stream starte, bevor die Daten größer als der interne Puffer werden, funktioniert alles.

Hier ist mein Code:

_read(size) { 
 
    var bytesAvailible = this._tool.getCurrentAddress() - this._offset; 
 
    var bufferStatus = this._readableState.highWaterMark - this._readableState.length -32; 
 
    var bytesToRead = Math.min(bytesAvailible, size - 32); 
 
    console.log("Cur Addr: ", this._tool.getCurrentAddress().toString(16), 
 
     " hwm: ", this._readableState.highWaterMark, 
 
     " length: ", this._readableState.length, 
 
     " bytesAvailible: ", bytesAvailible, 
 
     " size requested: ", size); 
 
    var chunk = getData(this._offset, bytesToRead); 
 

 
    if (!this.push(chunk)) { 
 
     console.log("Error pushing."); 
 
     return; 
 
    } else { 
 
     console.log("Pushed address: ", (this._offset).toString(16), " - ",(this._offset + chunk.length).toString(16), " Size: ", chunk.length); 
 
     this._offset += bytesToRead; // set offset to next address not read; 
 
    } 
 
    }

Und hier die Ausgabe:

Cur Addr: 2000ef20 hwm: 16384 length: 0 bytesAvailible: 61216 size requested: 16384 
 
Pushed address: 20000000 - 20003fe0 Size: 16352 
 
Cur Addr: 2000ef40 hwm: 16384 length: 16352 bytesAvailible: 44896 size requested: 16384 
 
Error pushing. 
 
Cur Addr: 2000ef80 hwm: 16384 length: 16352 bytesAvailible: 44960 size requested: 16384 
 
Error pushing. 
 
Cur Addr: 2000efa0 hwm: 16384 length: 16352 bytesAvailible: 44992 size requested: 16384 
 
Error pushing. 
 
Cur Addr: 20010140 hwm: 16384 length: 32704 bytesAvailible: 49504 size requested: 16384 
 
Error pushing. 
 
Cur Addr: 20010160 hwm: 16384 length: 32704 bytesAvailible: 49536 size requested: 16384 
 
Error pushing.

Kann mir jemand helfen? Warum fordert der Stream Daten durch Aufrufen von _read (size) an, obwohl der interne Puffer voll ist? Warum wird der interne Puffer nicht geleert?

Danke!

Antwort

0

Scheint, dass ich vermisse den Rückgabewert von this.push verstanden. Ich muss Daten pushen, bis es falsch zurückgibt. Ich habe versucht, den Block wieder zu schieben, als ich falsch wurde, weil ich dachte, dass es nicht zugänglich war.