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
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:
Der Abschnitt in den Node.js-Dokumenten zu Pufferung erläutert den Fehler, mit dem Sie konfrontiert werden.
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.
Tags und Links node.js stream node.js-stream