Tuesday, 7 November 2017

Nodejs Writefile Binære Alternativer


Node Js og binære data OPPDATERING: Ingen av dette bør være nødvendig, da FileReadStream i den nyeste noden bruker buffere som standard. Imidlertid ser det ut til at jeg enten gjør noe galt eller docs er utdatert, da det ikke fungerer på måten HEAD. To områder der utelukkende Node. js39 mangler, er håndtering av binære data og store strenge. I dette innlegget liker jeg å gå over noen teknikker for å håndtere binær data i knutepunkt, hvorav de fleste dreier seg om å håndtere V839s søppelkollektor, og det faktum at strenger i knutepunkt ikke er laget for binære data, de har gjort for UTF-8 og UTF-16 data. Det er tre grunnleggende detaljer som gjør det mulig å jobbe med data i Node. js en smerte: Store Strings (gt 64K) er ikke din venn. Binære (og ASCII) data i en node-streng lagres som den første byten til en UTF-16-streng. Binære data kan mest effektivt lagres i Node. js som en buffer. Ser på det første elementet, store stenger er ikke din venn. Node. js creator ry selv taklet dette problemet selv i en ytelses sammenligning han laget med nginx. Hvis du ser på pdf-filen, (eller se på det utviste diagrammet nedenfor), ser du at noden gjør en anstendig jobb som holder tritt med nginx frem til 64 byte mark treff, da går ytelsen bare fra hverandre. Årsaken, i ry39s ord: V8 har en generasjons søppelkollektor som flytter objekter rundt tilfeldig. Node kan ikke få en peker til rå strengdata for å skrive til socket. Du kan se dette i den aktuelle grafen i ryan39s lysbilder. som jeg har hentet og lagt ut nedenfor (jeg håper du ikke husker Ryan). Det som ikke umiddelbart var tydelig for meg etter å ha lest dette var hva dette betydde i tilfeller der man brukte nod til å passere store biter av binære data som kommer inn som strenger. hvis du bruker node å si, les fra filsystemet får du tilbake en binær streng, ikke en buffer. Spørsmålet mitt var: quotIf jeg har binære data som allerede er fast i en elendig UTF-16-streng, men hold den i buffer før du sender den ut, vil det hjelpe med speed. quot Svaret er en økning i gjennomstrømning fra 100 MiBSec til 160 MiBSec. Sjekk ut grafen nedenfor fra mine egne ytelsestester, hvor jeg spilte med forskjellige readChunk-størrelser (hvor mye data FileReadStream leser på en gang og bufferstørrelser (Hvor mye data lagrer vi i en buffer før du spyler til en stikkontakt): Som du kan se ytelsen ved hjelp av buffere (Buf) slår buksene av, skriver ved hjelp av strenger (Str). Forskjellen mellom de to kodestykkene kan ses nedenfor. Jeg trodde ikke at det å gjøre denne konverteringen i det hele tatt ville hjelpe meg, jeg skjønte når den allerede var inne en streng (som data fra en FileReadStream er), kan man også spyle den til stikkontakten og fortsette. Dette gjør at jeg lurer på om andre programmer også vil være best å akkumulere produksjonen deres (kanskje til og med deres UTF-8-utgang) i en Buffer der det er mulig, og deretter spyler bufferen til slutt, i stedet for å gjøre gjentatte anrop til res. write. Noen trenger å teste dette. I tillegg gjør dette meg til å lure på om ytterligere forbedringer i mitt eget testcase kunne forbedres hvis noden FileReadStream-objektet ble endret til returner en buffer i stedet for en streng. Videre kan du spørre om å bruke en større bufSize enn readChunk-størrelse, som jeg faktisk testet, men fant at det ikke var mye forskjell ved bruk av en større buffer, slik at den optimale strategien egentlig ser ut som å lese en 64KiB-klump i en 64KiB buffer. Du kan se disse dataene nederst i innlegget. I dataene jeg graferte over gjorde jeg en rekke løp med ab-c 100-n 1000 mot 1 MiB-fil som endret chunkSize og readSize. Relevant prøvekode kan ses nedenfor. Den fullstendige prøvekoden ville være min gaffel av node-paperboy. Storing data med Node. js-skrivbare strømmer Denne opplæringen vil forklare hvordan du lagrer data med Node. js-skrivbare strømmer og hvordan du oppretter din egen, tilpassede skrivbare strøm. Versjonsinformasjon Forfatter: Jeff Barczewski Publisert: 18. august 2013 Tags: nodejs, bekker Nivå: Mellomforutsetninger Forutsetninger: buffere, arrangementer, installer npm-moduler Node. js v0.10 (siste stabile er v0.10.16 av denne skrivingen), men strømmer har vanligvis vært en del av Node. js fra sine tidlige dager. Streams2 Writable abstrakt klasse kan brukes med eldre versjoner (før v0.10) av node ved å bruke npm-modulen lesbar-stream (testet med v1.0.15) Lagre data med skrivbar strømmer Skrive tekstfil Det enkleste eksempelet er bare skriftlig utf8 tekst, siden standardkoding hvis du skriver strenger er utf8. Hvis du vil skrive strenger med en annen koding, kan du bare endre createWriteStream-linjen eller legge til koding for hver skrive. Skrive binær fil Skrive en binær fil er bare et spørsmål om å bruke buffere i stedet for strenger for skrivingen. I eksemplet ovenfor bruker jeg crypto. createRandomBytes () for å lage en buffer av data, men du kan også bruke binære data som du oppretter eller leser fra en annen kilde like enkelt. Å vite når filen er skrevet Inntasting og utdata er asynkrone operasjoner i Node. js så hva hvis vi vil vite når en fil er ferdig skrevet Svaret er å sette opp lyttere til hendelser som strømmen sender ut. Avslutningsbegivenheten (lagt til i Node. js v0.10) indikerer at all data har blitt spylt til det underliggende systemet. På Node. js før v0.10, kan du legge til et cb til. end () for å få en indikasjon på når det hadde blitt spylt, men ferdig tar hensyn til eventuelle andre transformasjoner nedstrøms og slikt. Opprette egendefinerte Node. js-skrivbare strømmer Når du må lage din egen tilpassede skrivbar strøm for å lagre data i en database eller et annet lagringsanlegg, er det enkelt å bruke den nye Streams2 Writable abstrakte klassen som er tilgjengelig innfødt i Node. js 0.10 eller via npm-polyfillmodul lesbar strøm. For å lage en skrivbar strøm som implementerer all normal Node. js-strømadferd, må du bare underklasse Writable og implementere skrive (chunk, encoding, cb). Opprette skrivbar minnestrøm Her er et eksempel som skriver til en enkel datastore i minnet. Vi bruker navnet gitt ved opprettelsen av strømmen som nøkkel, og vi legger til data til verdien til ferdig. Writable streams er elegante og enkle å bruke. Skrive tekst eller binære data til Node. js-strømmer er uanstrengt, og selv å skape fullt funksjonelle, tilpassede skrivbare strømmer er en tur i parken med den nye streams2-funksjonaliteten introdusert i Node. js v0.10 (eller ved hjelp av polyfill lesbar strømmodul). For ytterligere lesing Del denne sidenDu gjør ting mye vanskeligere enn de trenger å være. Node Buffer-objektet tar base64 som input og gjør alt det som dekoder for deg. Du kan bare stripe dataene: bilde. del fra base64-strengen og send dataene til WriteFileAssistant. The WriteFileAssistant trenger bare å ta base64-strengen og sende det som et argument til Buffer-konstruktøren. Også å ha en på openSync-samtalen vil bryte ting også. Buffer tar en streng og en koding, så bruker den kodingsverdien til å behandle strengen i en rekke byte, så når du forteller at strengen er base64, vil den dekode base64 for deg og lage riktig dekodet rekkebyte å skrive til filen. besvart 8. september kl 11.30

No comments:

Post a Comment