Node.js Streams, die für die Transformation lesbar sind

8

Ich habe versucht, einen lesbaren und einen transformierten Stream zu verwenden, um eine sehr große Datei zu verarbeiten. Das Problem, auf das ich zu stoßen scheint, ist folgendes: Wenn ich am Ende keinen beschreibbaren Stream anlege, scheint das Programm zu beenden, bevor das Ergebnis zurückgegeben wird.

Beispiel: rstream.pipe(split()).pipe(tstream)

My tstream hat einen Emitter, der aussendet, wenn ein Zähler einen Schwellenwert erreicht. Wenn dieser Schwellenwert auf eine niedrige Zahl eingestellt ist, erhalte ich ein Ergebnis, aber wenn es hoch ist, gibt es nichts zurück. Wenn ich es an einen Dateischreiber übertrage, gibt es immer ein Ergebnis zurück. Fehle ich etwas Offensichtliches?

code:

%Vor%

Hier ist der Code für Qtransformstream

%Vor%     
ace040686 04.08.2015, 15:34
quelle

3 Antworten

6

BEARBEITEN:

Außerdem weiß ich nicht, wie hoch Ihr Zähler ist, aber wenn Sie den Puffer füllen, wird er keine Daten mehr an den Transformations-Stream übergeben. In diesem Fall wird completed niemals wirklich getroffen, weil Sie nie das Zählerlimit erreichen. Versuchen Sie, Ihre highwatermark zu ändern.

EDIT 2: Ein wenig besser Erklärung

Wie Sie sicher wissen, ist ein transform stream ein Duplex-Stream , was bedeutet, dass er Daten von einer Quelle akzeptieren und Daten an ein Ziel senden kann. Dies wird üblicherweise als Lesen bzw. Schreiben bezeichnet. Das transform stream erbt sowohl von read stream als auch von% Node.js implementiertem% ​​co_de%. Es gibt jedoch eine Einschränkung, die write stream muss nicht die _read- oder _write-Funktionen implementieren. In diesem Sinne kann man es als etwas weniger bekannt ansehen durchgestrichenen Stream .

Wenn Sie daran denken, dass transform stream das transform stream implementiert, müssen Sie auch daran denken, dass der Schreibstream immer ein Ziel hat, um seinen Inhalt zu löschen. Das Problem, das Sie haben besteht darin, dass Sie beim Erstellen von write stream keinen Ort zum Senden Ihrer Inhalte angeben können. Die einzige Möglichkeit, Daten vollständig durch den Transformationsdatenstrom zu leiten, besteht darin, sie in einen Schreibstream zu pipettieren. Andernfalls werden Ihre Datenströme gesichert und können keine Daten mehr aufnehmen, da die Daten nicht verwendet werden können .

Aus diesem Grund funktioniert es immer, wenn Sie zu einem Schreibstream pumpen. Der Schreibstrom mindert die Datensicherung, indem die Daten an ein Ziel gesendet werden, sodass alle Ihre Daten weitergeleitet werden und das Ereignis "Vollständig" ausgegeben wird.

Der Grund dafür, dass Ihr Code ohne den Schreibstream arbeitet, wenn die Stichprobengröße gering ist, besteht darin, dass Sie Ihren Stream nicht auffüllen, sodass der Transformationsdatenstrom genügend Daten aufnehmen kann, um das vollständige Ereignis / den Schwellenwert zu erreichen. Wenn der Schwellenwert erhöht wird, bleibt die Datenmenge, die Ihr Stream annehmen kann, ohne sie an einen anderen Ort zu senden (ein Schreibstream), gleich. Dadurch wird Ihr Stream gesichert, und er kann keine Daten mehr annehmen, sodass das abgeschlossene Ereignis nie ausgegeben wird.

Ich würde sagen, dass Sie, wenn Sie Ihre transform stream für den Transform-Stream erhöhen, in der Lage sind, Ihren Schwellenwert zu erhöhen und trotzdem den Code funktionieren zu lassen. Diese Methode ist jedoch falsch. Verlegen Sie Ihren Stream in einen Write-Stream, der die Daten an dev / null sendet, um diesen Write-Stream zu erstellen:

%Vor%

Der Abschnitt in den Node.js-Dokumenten zu Pufferung erläutert den Fehler, mit dem Sie konfrontiert werden.

    
RadleyMith 28.08.2015, 03:41
quelle
1

Sie unterbrechen nicht _transformieren und verarbeiten geht weit weit weg. Probieren Sie:

%Vor%

Deshalb scheint 'Programm zu beenden, bevor das Ergebnis zurückgegeben wird

Und geben Sie keine nutzlosen Daten aus:

%Vor%

Viel Glück

    
Mi Ke Bu 31.08.2015 13:51
quelle
1

Ich würde vorschlagen, statt eines Transform-Streams einen Writable zu verwenden. Benennen Sie dann _transform in _write um und Ihr Code wird den Stream konsumieren, wenn Sie ihn dorthin leiten. Ein Transformations-Stream, auf den bereits @Bradgnar hingewiesen hat, benötigt einen Consumer oder es wird den lesbaren Stream davon abhalten, mehr zu pushen Daten in den Puffer.

    
windm 03.09.2015 17:48
quelle

Tags und Links