Knoten Js und Binärdaten UPDATE: Nichts davon sollte notwendig sein, da FileReadStream im letzten Knoten standardmäßig Puffer verwendet. Allerdings scheint es, dass entweder I39m etwas falsch machen oder die docs sind veraltet, wie es doesn39t funktioniert so auf Knoten HEAD. Zwei Bereiche, in denen der exklusive Node. js39s leider fehlt, ist die Handhabung von Binärdaten und großen Strings. In diesem Beitrag I39d gern über einige Techniken für den Umgang mit binären Daten im Knoten, die meisten von ihnen dreht sich um den Umgang mit V839s Garbage Collector, und die Tatsache, dass Strings in Knoten nicht für binäre Daten gemacht werden, sie wurden für UTF-8 und gemacht UTF-16 Daten. Es gibt drei grundlegende Details, die die Arbeit mit Daten in Node. js machen einen Schmerz: Große Strings (gt 64K) sind nicht dein Freund. Binäre (und ASCII) Daten in einer Knotenfolge werden als das erste Byte einer UTF-16-Zeichenfolge gespeichert. Binäre Daten können am effizientesten in Node. js als Puffer gespeichert werden Lets Blick auf das erste Element, große Strings aren39t Ihr Freund. Node. js Schöpfer selbst stellte sich diese Frage selbst in einem Leistungsvergleich, den er mit nginx gemacht hat. Wenn du das pdf ansiehst (oder sieh dir das extrahierte Diagramm unten an), wirst du sehen, dass der Knoten einen anständigen Job macht, der mit nginx Schritt hält, bis die 64-Byte-Marke trifft, dann fällt die Leistung einfach auseinander. Der Grund, in ry39s Worte: V8 hat einen Generations-Garbage Collector, der Objekte um zufällig bewegt. Knoten kann nicht einen Zeiger auf rohe String-Daten zu schreiben, um Socket. Sie sehen dies in der entsprechenden Grafik in ryan39s Folien. Die ich bequem herausgeholt und nach unten gepostet habe (ich hoffe, dass du dich nicht verstanden hast.) Ryan). Was war mir jetzt sofort offensichtlich nach dem Lesen dieses war das, was das bedeutete in den Fällen, in denen man den Knoten benutzte, um große Bits von binären Daten zu passieren, die als Strings kommen. Wenn Sie den Knoten verwenden, um zu sagen, lesen Sie aus dem Dateisystem erhalten Sie eine binäre Zeichenfolge, nicht einen Puffer. Meine Frage war: quotIf ich bin binäre Daten bereits in einer lausigen UTF-16-String stecken, aber dann haften sie in Puffer vor dem Senden es aus, wird das mit speed. quot helfen Die Antwort eine Erhöhung der Durchsatz von 100 MiBSec auf 160 MiBSec. Schauen Sie sich die Grafik unten von meinen eigenen Performance-Tests an, wo ich mit verschiedenen ReadChunk-Größen gespielt habe (wie viel Daten das FileReadStream auf einmal liest und Puffergrößen (wieviel Daten, die wir in einem Puffer vor dem Spülen in einen Sockel speichern): Wie Sie sehen können Leistung mit Puffern (Buf) schlägt die Hose aus schreibt mit Strings (Str.) Der Unterschied zwischen den beiden Stücke Code ist unten zu sehen. Ich habe anfangs nicht gedacht, dass diese Umwandlung überhaupt helfen würde, dachte ich, sobald es schon in war Ein String (als Daten aus einem FileReadStream ist), man kann es auch an den Sockel spülen und weiterfahren. Das macht mich frage, ob es sich bei anderen Apps auch darum geht, ihre Ausgabe (vielleicht sogar ihre UTF-8-Ausgabe) in einem Puffer, wo möglich, dann endlich spülen die Puffer, anstatt wiederholen Anrufe zu res. write. Jemand muss es zu testen. Darüber hinaus macht mich dies frage mich, ob weitere Verbesserungen an meinem eigenen Testfall verbessert werden könnte, wenn das Knoten FileReadStream Objekt geändert wurde Um einen Puffer anstatt einen String zurückzugeben. Darüber hinaus können Sie fragen über die Verwendung einer größeren bufSize als readChunk Größe, die ich tatsächlich getestet habe, aber fand es gab nicht viel von einem Unterschied bei der Verwendung eines größeren Puffer, so dass die optimale Strategie wirklich scheint, ein 64KiB-Chunk in zu lesen Ein 64KiB Puffer. Sie können diese Daten am unteren Rand der Post sehen. In den Daten, die ich oben gezeichnet habe, habe ich eine Reihe von Läufen mit ab - c 100 - n 1000 gegen 1 MiB Datei geändert die chunkSize und readSize. Relevanter Beispielcode ist unten zu sehen. Der vollständige Beispielcode wäre meine Gabel von node-paperboy. Storing Daten mit Node. js beschreibbaren Streams Dieses Tutorial erklärt, wie man Daten mit Node. js beschreibbaren Streams zu speichern und wie man Ihren eigenen benutzerdefinierten beschreibbaren Stream zu erstellen. Versionsinformation Autor: Jeff Barczewski Veröffentlicht: August 18th, 2013 Tags: nodejs, streams Level: Intermediate Voraussetzungen: Puffer, Events, Installationen npm Module Node. js v0.10 (neueste Stall ist v0.10.16 ab diesem Schreiben), aber Streams Haben in der Regel ein Teil von Node. js aus seinen frühen Tagen Streams2 Writable abstrakte Klasse kann mit älteren Versionen (vor v0.10) des Knotens verwendet werden, indem npm Modul readable-stream (getestet mit v1.0.15) Speichern von Daten mit beschreibbaren Streams Schreiben von Textdatei Das einfachste Beispiel ist nur schriftlich utf8 Text, da die Standard-Codierung, wenn Sie Strings schreiben, ist utf8. Wenn du Strings mit einer anderen Codierung schreiben möchtest, kannst du einfach die createWriteStream-Zeile ändern oder jedem Codierung hinzufügen. Schreiben von Binärdateien Das Schreiben einer Binärdatei ist nur eine Frage der Verwendung von Buffers anstatt Strings für das Schreiben. Im obigen Beispiel verwende ich crypto. createRandomBytes (), um einen Puffer von Daten zu erstellen, aber Sie können binäre Daten verwenden, die Sie aus einer anderen Quelle genauso einfach erstellen oder lesen. Wissen, wann Datei geschrieben wurde Input und Output sind asynchrone Operationen in Node. js so was, wenn wir wissen wollen, wann eine Datei vollständig geschrieben wurde Die Antwort ist, um Hörer auf Ereignisse zu setzen, die der Stream aussendet. Das Finish-Ereignis (hinzugefügt in Node. js v0.10) zeigt an, dass alle Daten auf das zugrunde liegende System gespült wurden. Auf Node. js vor v0.10, könntest du eine cb zum. end () hinzufügen, um einen Hinweis darauf zu erhalten, wann das gereinigt worden war, aber das Finish berücksichtigt alle anderen Transformationen stromabwärts und so. Erstellen von benutzerdefinierten Node. js beschreibbaren Streams Wenn Sie Ihren eigenen benutzerdefinierten beschreibbaren Stream erstellen müssen, um Daten in einer Datenbank oder einem anderen Speicher zu speichern, ist es einfach, wenn Sie die neue Streams2 Writable abstrakte Klasse nativ in Node. js 0.10 oder über die verwenden Npm Polyfill-Modul lesbarer Strom. Um einen beschreibbaren Stream zu erstellen, der das gesamte normale Node. js-Stream-Verhalten implementiert, muss man nur die Subklasse schreiben. Schreiben und schreiben schreiben (Chunk, Codierung, CB). Erstellen eines beschreibbaren Speicherstroms Hier ist ein Beispiel, das in einen einfachen Datenspeicher geschrieben wird. Wir verwenden den Namen bei der Erstellung des Streams als Schlüssel, und wir fügen Daten an den Wert bis zum Ende. Writable Streams sind elegant und einfach zu bedienen Schreiben Text oder binäre Daten zu Node. js Streams ist mühelos, und sogar die Schaffung von voll funktionsfähigen benutzerdefinierten beschreibbaren Streams ist ein Spaziergang im Park mit der neuen Streams2 Funktionalität eingeführt in Node. js v0.10 (oder Mit dem polyfill lesbaren Stream-Modul). Für weitere Lesung Teilen Sie diese Seite Lesen von Text und Binärdaten mit Node. js lesbaren Streams Dieses Tutorial erklärt die Verwendung und Erstellung von node. js lesbaren Streams: Versionsinformation Autor: Jeff Barczewski Veröffentlicht: August 3rd, 2013 Tags: nodejs, streams Level: Intermediate Voraussetzungen: Krypto, Events, Installationen npm Module Node. js v0.10 (letzter Stall ist v0.10.15 ab diesem Schreiben), aber Streams sind in der Regel ein Teil von Node. js aus seinen frühen Tagen Streams2 kann mit älteren verwendet werden Versionen von Knoten mithilfe von npm-Modul readable-stream Konsumieren oder Verwenden von lesbaren Streams Einfache Beispiel für das Lesen einer Datei und Echo es zu stdout: Erstellen einer sha1 Digest einer Datei und Echo das Ergebnis zu stdout (ähnlich Shasum): Das Datenereignis ist Auf den lesbaren Stream für jeden Teil der Daten gefeuert, also aktualisierst du den Digest mit jedem Chunk, während du gehst, dann endlich das Endereignis ausgelöst wird, wenn der Stream beendet ist, damit du das Endergebnis ausgeben kannst. Beachten Sie, dass jedes Mal, wenn Sie. on () anrufen, um einen Zuhörer zu registrieren, gibt es den ursprünglichen Stream zurück, damit Sie Methoden einfach ketten können. Mit Node. js 0.10 gibt es einen besseren Weg, um Streams zu verbrauchen. Die lesbare Schnittstelle macht es einfacher, mit Streams zu arbeiten, vor allem Streams, wo Sie andere Dinge zwischen dem Erstellen eines Streams und der Verwendung des Streams tun möchten. Diese neueren lesbaren Streams sind Pull-Streams, wo Sie die Daten anfordern, wenn Sie dafür gelesen werden, anstatt die Daten zu Ihnen geschoben zu haben. Der Schlüssel zum Verständnis dieses Beispiels ist, dass mit den neuen Streams2 Lesbare Schnittstelle ein lesbares Ereignis ausgesendet wird, sobald Daten verfügbar sind, um gelesen zu werden, und Sie können anrufen. read (), um Chunks davon zu lesen. Sobald es keine Daten mehr gibt. Read () gibt null zurück, aber dann wird wieder ein lesbares Ereignis ausgelöst, wenn Daten wieder verfügbar sind. Dies geht bis zum Ende der Datei weiter, wenn das Ende wie vorher gefeuert wird. Produzieren eines lesbaren Streams Um Streams mit dem Dateisystem oder von http zu verwenden, kannst du den Kern fs und http Methoden verwenden, um einen Stream zu konstruieren, aber wie würdest du deinen eigenen Stream erstellen und ihn mit Daten füllen. Dies könnte Daten aus einer Datenbank oder sein Aus einer beliebigen Anzahl von Quellen. Hier ist ein Beispiel für die Erstellung eines lesbaren Streams, der aus zufälligen Binärdaten erzeugt wird. Dies wäre bei der Erstellung von Streams zum Testen nützlich: Hinweis: Nach dem Lesen () heißt das, wir sollten 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 bearbeiten möchten, können Sie eine Abhängigkeit für den lesbaren Stream in Ihrem package. json hinzufügen und die Zeile 5 ändern, um zu lesen: Dies wird die native verwenden Lesbarer Stream, wenn Node. js Version 0.10 ist und wenn nicht, dann lädt es das polyfill lesbare Stream-Modul und benutzt es von dort aus. Pause Fortsetzung von Stream und Streams2 Da Streams manchmal Daten schneller liefern können, als eine Anwendung es verbrauchen kann, beinhalten Streams die Fähigkeit zu pausieren und die Daten werden gepuffert, bis der Stream wieder aufgenommen wird. Vor dem Streams2 müssten Sie sorgfältig darauf achten, pausieren und wieder aufnehmen Methoden sowie Pufferung der Daten, bis wieder aufgenommen. Allerdings lesbar von streams2 (Node. js 0.10 oder über das lesbare 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 einem Readable umwandeln, um die neue Schnittstelle auf dem alten Stream zu implementieren: Eine andere Situation, wo Sie sich Sorgen um Pause und Fortsetzung machen müssen, ist, wenn Ihr verbrauchender Code die alte Push-Style-Schnittstelle nennt. on (39data39, listener). Dies setzt den Stream in den Rückwärtskompatibilitätsmodus und du müsst anrufen. Pause () und. resume () um die Rate der Daten zu steuern, die zu deiner Anwendung kommen. Weitere Informationen finden Sie in den Stream-API-Dokumenten, wenn Sie die ältere Schnittstelle in Ihrem Code verwenden. Objekt-Streams Anfänglich, als Ströme eingeführt wurden, zeigte die offizielle API an, dass Datenblöcke, die gestreamt werden, Puffer oder Strings sein würden, aber viele Benutzer fanden, dass es großartig war, auch Objekte zu streamen. Streams2 in Node. js 0.10 hat einen Objektmodus zu Streams hinzugefügt, um zu formalisieren, wie das funktionieren sollte. Im Objektmodus. Read (n) gibt einfach das nächste Objekt zurück (ignoriert das n). Um einen Stream in den Objektmodus zu schalten, setzen Sie die objectMode-Eigenschaft auf true in den Optionen, die verwendet werden, um Ihren lesbaren Stream zu erstellen. So können Sie Objekte in Strömen genauso einfach verwenden, wie Sie Puffer und Strings verwenden können, aber die einzige Einschränkung ist, dass die Objekte Sie sind Pass kann nicht null sein, da dies zeigt, dass der Stream beendet ist. Node. js lesbare Ströme sind flexibel und einfach Node. js lesbare Ströme sind einfach zu verbrauchen und sogar einfach zu konstruieren. Sie können nicht nur Stream Binär-und String-Daten, sondern auch Objekte und noch nutzen die Stream-Funktionalität. Ich hoffe, dass Sie diese schnelle Tour durch lesbare Ströme genossen haben, lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben. Für zusätzliche Lesung Teilen Sie diese Seite Lesen Sie den Inhalt einer Datei in den Speicher ist eine sehr häufige Programmieraufgabe, und wie bei vielen anderen Dingen bietet die Node. js-Kern-API Methoden, um diese trivial zu machen. Es gibt eine Vielzahl von Dateisystemmethoden, die alle im fs-Modul enthalten sind. Der einfachste Weg, um den gesamten Inhalt einer Datei zu lesen, ist mit fs. readFile. Wie folgt: encoding ist ein optionaler Parameter, der den Typ der Codierung angibt, um die Datei zu lesen. Mögliche Codierungen sind ascii, utf8 und base64. Wenn keine Codierung vorhanden ist, ist die Voreinstellung utf8. Callback ist eine Funktion zum Aufruf, wenn die Datei gelesen wurde und der Inhalt fertig ist - es werden zwei Argumente, Fehler und Daten übergeben. Wenn es keinen Fehler gibt, ist der Fehler null und die Daten enthalten den Dateiinhalt sonst fehler enthält die Fehlermeldung. Also, wenn wir Etchosts lesen und in Stdout drucken wollten (genau wie UNIX Katze): Der Inhalt von Etchosts sollte nun für euch sichtbar sein, vorausgesetzt, Sie haben die Erlaubnis, die Datei an erster Stelle zu lesen. Lets jetzt einen Blick auf ein Beispiel von dem, was passiert, wenn Sie versuchen, eine ungültige Datei zu lesen - das einfachste Beispiel ist eine, die nicht existiert. Dies ist die Ausgabe: Dies ist eine grundlegende Node. js Error-Objekt - es kann oft nützlich sein, err. stack direkt zu protokollieren, da diese eine Stack-Trace an den Speicherort in Code enthält, bei dem das Error-Objekt erstellt wurde.
No comments:
Post a Comment