Nó Js e dados binários UPDATE: Nada disso deve ser necessário, como FileReadStream no nó mais recente usa buffers por padrão. No entanto, parece que I39m fazer algo errado ou os documentos estão desatualizados, como ele não funciona dessa maneira no nó HEAD. Duas áreas onde o exclined Node. js39s infelizmente falta é o tratamento de dados binários e seqüências de caracteres grandes. Neste post eu gostaria de passar em revista algumas técnicas para lidar com dados binários no nó, a maioria dos quais gira em torno de lidar com V839s lixo coletor, eo fato de que as seqüências de caracteres no nó não são feitas para dados binários, eles foram feitos para UTF-8 e UTF-16 dados. Existem três principais detalhes sangrentos que tornam o trabalho com dados em Node. js uma dor: Cordas grandes (gt 64K) não são seu amigo. Os dados binários (e ASCII) em uma seqüência de nó são armazenados como o primeiro byte de uma string UTF-16. Dados binários podem ser mais eficientemente armazenados em Node. js como um Buffer Permite olhar para o primeiro item, cordas grandes aren39t seu amigo. Node. js criador ry próprio abordou esta questão ele mesmo em uma comparação de desempenho que ele fez com nginx. Se você visualizar o pdf, (ou olhar para o gráfico extraído abaixo) você verá que o nó faz um trabalho decente, mantendo o ritmo com nginx até a marca de 64 bytes hits, então o desempenho apenas desmorona. A razão, em palavras ry39s: V8 tem um coletor de lixo geracional que move objetos ao redor aleatoriamente. Node cant obter um ponteiro para dados de seqüência de caracteres em bruto para gravar no soquete. Você pode ver isso no gráfico relevante nos slides do ryan39s. Que eu devo extrair convenientemente e afixado abaixo (eu espero que você não se importa Ryan). O que não foi imediatamente óbvio para mim depois de ler isso foi o que isso significava nos casos em que um estava usando o nó para passar em torno de grandes bits de dados binários que entram como seqüências de caracteres. Se você usar o nó para dizer, ler a partir do sistema de arquivos que você voltar uma seqüência de caracteres binários, não um buffer. Minha pergunta era: "Se eu tiver dados binários já presos em uma péssima string UTF-16, mas depois coloque-a no buffer antes de enviá-la para fora, será que ajuda com speed. quot A resposta um aumento na taxa de transferência de 100 MiBSec para 160 MiBSec. Confira o gráfico abaixo de meus próprios testes de desempenho, onde eu joguei com diferentes tamanhos readChunk (quantos dados o FileReadStream lê de uma vez e os tamanhos do buffer (quantos dados armazenamos em um buffer antes de limpar a um soquete): Como você pode ver Desempenho usando buffers (Buf) bate as calças fora escreve usando strings (Str). A diferença entre os dois pedaços de código pode ser visto abaixo. I inicialmente didn39t pensar que fazer esta conversão iria ajudar a todos, eu pensei que uma vez que já estava em Uma seqüência de caracteres (como dados de um FileReadStream é), um pode também liberá-lo para o soquete e continuar. Isso me faz pensar se outras aplicações também seria melhor fora de acumular sua saída (talvez até mesmo a sua saída UTF-8) em um Buffer sempre que possível e, em seguida, finalmente liberando o Buffer, em vez de fazer chamadas repetidas para res. write. Alguém precisa testar isso. Além disso, isso me faz pensar se outras melhorias no meu próprio caso de teste poderia ser melhorado se o nó FileReadStream objeto foi modificado para Retornar um Buffer em vez de uma Cadeia de caracteres. Além disso, você pode estar perguntando sobre o uso de um bufSize maior do que o tamanho readChunk, que eu realmente testar, mas descobriu que não havia muita diferença ao usar um buffer maior, então a estratégia ideal realmente parece ler um pedaço 64KiB em Um tampão de 64KiB. Você pode ver esses dados na parte inferior da postagem. Nos dados que eu graphed acima, eu fiz um número de execuções com ab - c 100 - n 1000 contra 1 arquivo MiB mudando o chunkSize e readSize. Código de amostra relevante pode ser visto abaixo. O código de exemplo completo seria o meu garfo do nó-paperboy. Gravando dados com fluxos graváveis Node. js Este tutorial explicará como armazenar dados com fluxos graváveis Node. js e como criar seu próprio fluxo gravável personalizado. Informações sobre a versão Autor: Jeff Barczewski Publicado em: 18 de agosto de 2013 Tags: nodejs, streams Nível: Intermediário Pré-requisitos: buffers, events, install npm modules Node. js v0.10 (último estável é v0.10.16 até à data desta redação) Geralmente têm sido uma parte do Node. js desde seus primeiros dias Streams2 A classe writeable abstract pode ser usada com versões anteriores (antes da v0.10) do nó usando o módulo npm readable-stream (testado com v1.0.15) Armazenando dados com gravável Fluxos Escrevendo arquivo de texto O exemplo mais simples é apenas por escrito texto utf8, uma vez que a codificação padrão se você escrever strings é utf8. Se você quiser escrever strings com uma codificação diferente, então você pode simplesmente alterar a linha createWriteStream ou adicionar codificação para cada gravação. Escrevendo arquivo binário Escrever um arquivo binário é apenas uma questão de usar Buffers em vez de seqüências de caracteres para a gravação. No exemplo acima, eu uso crypto. createRandomBytes () para criar um Buffer de dados, mas você pode usar dados binários que você cria ou lê de outra fonte tão facilmente. Saber quando arquivo foi escrito Entrada e saída são operações assíncronas em Node. js Então, o que se queremos saber quando um arquivo foi totalmente escrito A resposta é a configuração de ouvintes para eventos que o fluxo emite. O evento de acabamento (adicionado em Node. js v0.10) indica que todos os dados foram descarregados para o sistema subjacente. Em Node. js antes de v0.10, você poderia adicionar um cb para o. end () para obter uma indicação de quando que tinha sido liberado, no entanto terminar leva em conta quaisquer outras transformações a jusante e tal. Criando fluxos graváveis Node. js personalizados Quando você precisa criar seu próprio fluxo gravável personalizado para armazenar dados em um banco de dados ou em outra facilidade de armazenamento, é fácil se você usar a nova classe abstrata de Streams2 Writable disponível nativamente em Node. js 0.10 ou via Npm polyfill módulo readable-stream. Para criar um fluxo gravável que implementa todo o comportamento de fluxo Node. js normal, você só precisa subclasse e escrever write (chunk, encoding, cb). Criando fluxo de memória gravável Aqui está um exemplo que está escrevendo em um armazenamento de dados simples na memória. Estamos usando o nome dado na criação do fluxo como a chave, e acrescentamos dados ao valor até terminar. Os fluxos graváveis são elegantes e simples de usar. Escrever texto ou dados binários para fluxos Node. js é fácil, e até mesmo criar fluxos graváveis personalizados totalmente funcionais é um passeio no parque com a nova funcionalidade streams2 introduzida no Node. js v0.10 (ou Usando o módulo de leitura de fluxo polifilho). Para leitura adicional Compartilhar esta páginaLeitura de texto e dados binários com fluxos legíveis Node. js Este tutorial irá explicar o uso ea criação de fluxos read. js readable: Informações da versão Autor: Jeff Barczewski Publicado em: 3 de agosto de 2013 Tags: nodejs, streams Nível: Intermediário Pré-requisitos: cripto, eventos, instalar npm módulos Node. js v0.10 (último estável é v0.10.15 até à data desta escrita), mas os córregos foram geralmente uma parte de Node. js desde seus primeiros dias Streams2 pode ser usado com mais velhos Versões do nó usando o módulo npm readable-stream Consumindo ou usando fluxos legíveis Exemplo simples de leitura de um arquivo e ecoando para stdout: Criando um sha1 digest de um arquivo e ecoando o resultado para stdout (similar a shasum): O evento de dados é Disparado sobre o fluxo legível para cada pedaço de dados, então você atualizar o digest com para cada pedaço como você vai, então finalmente o evento final é disparado quando o fluxo terminou para que você possa produzir o resultado final. Note que cada vez que você chama. on () para registrar um ouvinte ele retorna o fluxo original para que você possa encadear métodos facilmente. Com Node. js 0.10 há uma maneira melhor de consumir fluxos. A interface legível torna mais fácil trabalhar com fluxos, especialmente fluxos onde você quer fazer outras coisas entre criar um fluxo e usar o fluxo. Esses fluxos legíveis mais novos são puxar fluxos onde você solicita os dados quando é lido para ele, em vez de ter os dados enviados para você. A chave para entender este exemplo é que com a nova interface de leitura de streams2, um evento legível será emitido assim que os dados estiverem disponíveis para serem lidos e você pode chamar. read () para ler pedaços dele. Uma vez que não há mais dados disponíveis. Read () retorna null, mas então outro evento legível é acionado novamente quando os dados estiverem disponíveis novamente. Isso continua até o final do arquivo quando final é acionado como antes. Produzindo um fluxo legível Para usar fluxos com o sistema de arquivos ou do http, você pode usar os métodos core fs e http para construir um fluxo, mas como você criaria seu próprio fluxo e o preencheria com dados. Isso pode ser dados de um banco de dados ou De qualquer número de fontes. Aqui está um exemplo de criação de um fluxo legível que é gerado a partir de dados aleatórios binários, em seguida, hash como antes. Isso seria útil na criação de fluxos para testes: Nota: depois de ler () é chamado, devemos continuar lendo até terminar ou até push () retornar false. Usando Streams2 com versões mais antigas do Node. js Se você quiser fazer este código funcionar com o Node. js mais antigo que 0.10, você pode incluir uma dependência para readable-stream em seu pacote. json e alterar a linha 5 para ler: Fluxo legível se Node. js versão é 0.10 e se não, então ele irá carregar o módulo polyfill readable-stream e usá-lo a partir daí. Pausar o currículo do fluxo e do Streams2 Uma vez que os fluxos podem às vezes fornecer dados mais rapidamente do que um aplicativo pode consumi-lo, os fluxos incluem a capacidade de pausar e os dados são armazenados em buffer até que o fluxo seja reiniciado. Antes dos streams2, você precisaria prestar muita atenção para pausar e retomar métodos, bem como buffering os dados até retomada. No entanto, Readable de streams2 (Node. js 0.10 ou através do pacote readable-stream) implementa que a funcionalidade para você e os streams são pausados automaticamente até que. read () seja chamado. Você também pode envolver fluxos antigos com uma legível para implementar a nova interface no fluxo antigo: Outra situação onde você precisa se preocupar com pausa e currículo é se o seu consumo de código usa a interface de estilo antigo push chamar. on (39data39, ouvinte). Isso coloca o fluxo no modo de compatibilidade com versões anteriores e você precisaria chamar. pause () e. resume () para controlar a taxa de dados que chegam à sua aplicação. Consulte os documentos da API do Stream para obter detalhes se você estiver usando a interface mais antiga no seu código. Transmissão de Objetos Inicialmente, quando os fluxos foram introduzidos, a API oficial indicou que os pedaços de dados sendo transmitidos seriam Buffers ou strings, porém muitos usuários descobriram que era ótimo poder transmitir objetos também. Streams2 in Node. js 0.10 adicionou um modo de objeto a fluxos para formalizar como isso deveria funcionar. Quando no modo de objeto. Read (n) simplesmente retorna o próximo objeto (ignorando o n). Para alternar um fluxo para o modo de objeto, defina a propriedade objetoMode como verdadeira nas opções usadas para criar seu fluxo legível. Assim, você pode usar objetos em fluxos com a mesma facilidade possível para usar Buffers e strings, mas a única limitação é que os objetos que você Pass não pode ser nulo, uma vez que irá indicar que o fluxo foi encerrado. Os fluxos legíveis Node. js são flexíveis e os fluxos legíveis simples Node. js são fáceis de consumir e até simples de construir. Você também não pode transmitir dados binários e de string, mas também objetos e ainda aproveitar a funcionalidade de fluxo. Espero que tenha gostado deste passeio rápido de fluxos legíveis, me avise se você tiver alguma dúvida. Para leitura adicional, compartilhe esta página. A leitura do conteúdo de um arquivo na memória é uma tarefa de programação muito comum e, como em muitas outras coisas, a API principal do Node. js fornece métodos para tornar isso trivial. Há uma variedade de métodos de sistema de arquivos, todos contidos no módulo fs. A maneira mais fácil de ler todo o conteúdo de um arquivo é com fs. readFile. Da seguinte forma: a codificação é um parâmetro opcional que especifica o tipo de codificação para ler o arquivo. As codificações possíveis são ascii, utf8 e base64. Se nenhuma codificação for fornecida, o padrão é utf8. Callback é uma função para chamar quando o arquivo foi lido e o conteúdo está pronto - é aprovado dois argumentos, erros e dados. Se não houver erro, o erro será nulo e os dados conterão o conteúdo do arquivo, caso contrário, o erro contém a mensagem de erro. Então, se quiséssemos ler etchosts e imprimi-lo para stdout (como o gato UNIX): O conteúdo de etchosts agora deve ser visível para você, desde que você tenha permissão para ler o arquivo em primeiro lugar. Vamos agora dar uma olhada em um exemplo do que acontece quando você tenta ler um arquivo inválido - o exemplo mais fácil é aquele que não existe. Esta é a saída: Este é um objeto de erro Node. js básico - muitas vezes pode ser útil para registrar err. stack diretamente, uma vez que isso contém um rastreamento de pilha para o local no código no qual o objeto Error foi criado.
Comments
Post a Comment