Monday 5 June 2017

Nodejs Readfile Binary Options

Lesen von Text - und Binärdaten mit Node. js lesbaren Streams Dieses Tutorial erklärt die Verwendung und Erstellung von node. js lesbaren Streams: Versionsinformationen Autor: Jeff Barczewski Veröffentlicht: August 3rd, 2013 Tags: nodejs, streams Level: Intermediate Voraussetzungen: crypto, Ereignisse, installieren Sie npm Module Node. js v0.10 (letzter Stall ist v0.10.15 ab diesem Schreiben), aber Ströme waren in der Regel ein Teil der Node. js aus ihren frühen Tagen Streams2 kann mit älteren Versionen von Knoten verwendet werden Npm-Modul readable-stream Konsumieren oder Verwenden von lesbaren Strömen Einfaches Beispiel für das Lesen einer Datei und das Wiederholen auf stdout: Erstellen eines Sha1-Aufbaus einer Datei und Echo des Ergebnisses auf stdout (ähnlich shasum): Das Datenereignis wird auf dem lesbaren Stream ausgelöst Für jeden Teil der Daten, so dass Sie aktualisieren die Digest mit für jedes Stück, wie Sie gehen, dann endlich das End-Ereignis gefeuert wird, wenn der Stream beendet ist, so können Sie das Endergebnis ausgeben. Beachten Sie, dass jedes Mal, wenn Sie. on () aufrufen, um einen Listener zu registrieren, gibt es den ursprünglichen Stream zurück, so dass Sie Methoden leicht verketten können. Mit Node. js 0.10 gibt es einen besseren Weg, um Streams zu verbrauchen. Die lesbare Schnittstelle erleichtert die Arbeit mit Streams, vor allem Streams, wo Sie andere Dinge zwischen der Erstellung eines Streams und mit dem Stream zu tun. Diese neueren Readable-Streams sind Pull-Streams, wo Sie die Daten anfordern, wenn Sie für sie gelesen werden, anstatt die Daten an Sie gedrückt. Der Schlüssel zum Verständnis dieses Beispiels ist, dass mit der neuen streams2-lesbaren Schnittstelle ein lesbares Ereignis ausgesendet wird, sobald Daten verfügbar sind, um gelesen zu werden, und Sie können. read () aufrufen, um Chunks davon zu lesen. Sobald keine Daten mehr verfügbar sind. Read () gibt null zurück, aber ein weiteres lesbares Ereignis wird erneut ausgelöst, wenn Daten wieder verfügbar sind. Dies wird bis zum Ende der Datei fortgesetzt, wenn das Ende wie zuvor gefeuert wird. Erzeugung eines lesbaren Streams Um Streams mit dem Dateisystem oder von http zu verwenden, können Sie die Kern-fs - und http-Methoden verwenden, um einen Stream zu konstruieren, aber wie würden Sie Ihren eigenen Stream erstellen und ihn mit Daten füllen? Aus einer beliebigen Anzahl von Quellen. Hier ist ein Beispiel für die Erstellung eines lesbaren Strom, der aus zufälligen binären Daten erzeugt wird, dann Hashing es wie zuvor. Dies wäre bei der Erstellung von Streams zum Testen nützlich: Anmerkung: Nach dem Aufruf von read () sollten wir weiterlesen, bis wir fertig sind oder bis push () false zurückgibt. Verwenden von Streams2 mit älteren Node. js-Versionen Wenn Sie diesen Code mit Node. js älter als 0.10 ausführen möchten, können Sie in Ihrem package. json eine Abhängigkeit für readable-stream eingeben und Zeile 5 ändern, um zu lesen: Dies wird die native verwenden Lesbarer Stream, wenn Node. js Version 0.10 ist und wenn nicht, dann wird es laden das Polyfill readable-stream-Modul und verwenden Sie es von dort aus. Pause / Fortsetzen von Stream und Streams2 Da Streams manchmal Daten schneller liefern können, als eine Anwendung sie verbrauchen kann, beinhalten Streams die Pause und die Daten werden gepuffert, bis der Stream wieder aufgenommen wird. Vor den Streams2 müssten Sie sorgfältige Aufmerksamkeit auf Pausen und Wiederaufnahme Methoden sowie Pufferung der Daten bis zur Wiederaufnahme zu zahlen. Allerdings lesbar von Streams2 (Node. js 0.10 oder über das readable-stream Paket) implementiert diese Funktionalität für Sie und Streams werden automatisch pausiert, bis. read () aufgerufen wird. Sie können auch alte Streams mit einer Readable-Datei umwandeln, um die neue Schnittstelle auf dem alten Stream zu implementieren: Eine andere Situation, in der Sie sich um Pause und Fortsetzen Sorgen machen müssen, ist, wenn Ihr konsumierender Code die alte Push-Stiloberfläche nennt. on (39data39, listener). Dadurch wird der Stream in den Abwärtskompatibilitätsmodus versetzt und Sie müssen pause () und. resume () aufrufen, um die Datenrate zu steuern, die zu Ihrer Anwendung kommt. Weitere Informationen finden Sie in den Stream-API-Dokumenten, wenn Sie die ältere Schnittstelle in Ihrem Code verwenden. Objektströme Anfangs bei der Einführung von Strömen zeigte die offizielle API an, dass Datenblöcke, die gestreamt würden, Buffer oder Strings sein würden, aber viele Nutzer fanden heraus, dass es toll war, auch Objekte streamen zu können. Streams2 in Node. js 0.10 fügte einen Objektmodus zu Streams hinzu, um zu formalisieren, wie dies funktionieren sollte. Im Objektmodus. Read (n) liefert einfach das nächste Objekt zurück (ignoriert das n). Um einen Stream in den Objektmodus zu schalten, setzen Sie die Eigenschaft objectMode in den Optionen, die verwendet werden, um Ihren lesbaren Stream zu erstellen, so dass Sie Objekte in Streams genauso verwenden können wie Sie Buffers und Strings verwenden können, aber die einzige Einschränkung ist, dass die Objekte Sie Pass kann nicht null sein, da das anzeigt, dass der Stream beendet ist. Node. js lesbaren Streams sind flexible und einfache Node. js lesbaren Streams sind leicht zu verbrauchen und sogar einfach zu konstruieren. Sie können nicht nur Strom Binär-und String-Daten, sondern auch Objekte und noch profitieren von Stream-Funktionalität. Ich hoffe, Sie genossen diese schnelle Tour von lesbaren Streams, lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben. Für zusätzliches Lesen Share this pageNode Js und Binärdaten UPDATE: Keines dieser sollte erforderlich sein, da FileReadStream im neuesten Knoten Puffer standardmäßig verwendet. Allerdings scheint es, dass entweder I39m etwas falsch oder die docs sind veraltet, da es doesn39t Arbeit auf diese Weise auf Knoten HEAD. Zwei Bereiche, in denen der ausgeklügelte Node. js39s traurig fehlt, ist die Behandlung von binären Daten und großen Strings. In diesem Beitrag I39d gehen über einige Techniken für den Umgang mit binären Daten im Knoten, die meisten davon dreht sich um den Umgang mit V839s Garbage Collector, und die Tatsache, dass Strings im Knoten sind nicht für binäre Daten gemacht, they39re für UTF-8 gemacht und UTF-16-Daten. Es gibt drei Hauptspitzen Details, die die Arbeit mit Daten in Node. js ein Schmerz machen: Große Strings (gt 64K) sind nicht dein Freund. Binärdaten (und ASCII-Daten) in einer Knotenzeichenfolge werden als das erste Byte einer UTF-16-Zeichenfolge gespeichert. Binäre Daten können am effizientesten gespeichert werden in Node. js als Buffer Lets Blick auf das erste Element, große Saiten aren39t Ihr Freund. Node. js Schöpfer ry selbst selbst dieses Problem selbst in einem Performance-Vergleich nahm er mit nginx. Wenn Sie das pdf sehen (oder betrachten Sie das extrahierte Diagramm unten), sehen Sie, dass der Knoten einen anständigen Job hält, der mit Nginx Schritt hält, bis die 64-Byte-Marke schlägt, dann Leistung fällt gerade auseinander. Der Grund, in ry39s Worte: V8 hat eine Generation Garbage Collector, die Objekte bewegt sich nach dem Zufallsprinzip. Knoten kann nicht einen Zeiger auf rohen String-Daten zu schreiben, um Socket. Sie können dies in der entsprechenden Grafik in ryan39s Folien zu sehen. Die ich bequem extrahiert und veröffentlicht (ich hoffe, Sie don39t mind Ryan). Was wasn39t sofort offensichtlich für mich nach dem Lesen war dies, was dies bedeutete in Fällen, in denen man mit Knoten, um große Bits von binären Daten, die als Strings kommen übergeben. Wenn Sie verwenden Knoten zu sagen, aus dem Dateisystem zu lesen, erhalten Sie eine binäre Zeichenfolge, nicht einen Puffer. Meine Frage war: "Ich habe binäre Daten bereits in einem lausigen UTF-16-String stecken, aber dann stecken sie in Puffer, bevor sie senden, wird das mit speed. quot helfen, die Antwort eine Erhöhung des Durchsatzes von 100 MiB / Sek MiB / Sek. Schauen Sie sich die Grafik unten aus meiner eigenen Performance-Tests, wo ich mit verschiedenen readChunk-Größen gespielt (wie viele Daten der FileReadStream liest auf einmal und Puffergrößen (Wie viele Daten, die wir in einem Puffer vor dem Spülen in einen Sockel zu speichern): Wie Sie sehen können (Buf) schlägt die Hose aus schreibt mit Strings (Str ).Der Unterschied zwischen den beiden Teilen des Codes kann unten gesehen werden. Ich ursprünglich didn39t glaube, dass diese Umwandlung helfen würde überhaupt, dachte ich, sobald es war bereits in Ein String (wie Daten aus einem FileReadStream ist), kann man ebenso gut spülen Sie es an die Steckdose und weiter auf. Dies macht mich frage mich, wenn andere Anwendungen wäre auch am besten aus Akkumulation ihrer Ausgabe (vielleicht sogar ihre UTF-8-Ausgang) in einem Puffer, wo möglich, dann endlich spülen den Puffer, anstatt wiederholt Anrufe an res. write. Jemand muss dies zu testen. Darüber hinaus fragt mich, ob weitere Verbesserungen an meinem eigenen Testfall verbessert werden könnte, wenn der Knoten FileReadStream Objekt geändert wurde Um einen Buffer anstelle eines Strings zurückzugeben. Darüber hinaus können Sie über die Verwendung eines größeren bufSize als readChunk Größe, die ich tatsächlich getestet haben, aber festgestellt, gab es nicht viel von einem Unterschied bei der Verwendung eines größeren Puffer, so dass die optimale Strategie scheint wirklich zu lesen ein 64KiB-Chunk in Einen 64KiB-Puffer. Sie können diese Daten am unteren Rand des Postens sehen. In den Daten, die ich graphed, bildete ich eine Anzahl von Läufen mit ab - c 100 - n 1000 gegen 1 MiB Akte, die chunkSize und readSize ändert. Entsprechender Beispielcode kann unten gezeigt werden. Der vollständige Beispielcode wäre meine Gabel des Knoten-Papierboys.


No comments:

Post a Comment