"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Tratamento eficiente de dados com streams Node.js

Tratamento eficiente de dados com streams Node.js

Publicado em 2024-11-09
Navegar:487

Efficient Data Handling with Node.js Streams

Neste artigo, vamos nos aprofundar nos Streams Node.js e entender como eles ajudam no processamento eficiente de grandes quantidades de dados. Os fluxos fornecem uma maneira elegante de lidar com grandes conjuntos de dados, como leitura de arquivos grandes, transferência de dados pela rede ou processamento de informações em tempo real. Ao contrário das operações de E/S tradicionais que leem ou gravam todos os dados de uma vez, os fluxos dividem os dados em partes gerenciáveis ​​e os processam peça por peça, permitindo o uso eficiente da memória.

Neste artigo, abordaremos:

  1. O que são fluxos Node.js?
  2. Diferentes tipos de streams em Node.js.
  3. Como criar e usar streams.
  4. Casos de uso reais para streams.
  5. Vantagens de usar streams.

O que são fluxos Node.js?

Um stream em Node.js é um fluxo contínuo de dados. Os fluxos são especialmente úteis para lidar com tarefas vinculadas a E/S, como leitura de arquivos, comunicação em rede ou interação com bancos de dados. Em vez de esperar que uma operação inteira seja concluída, os fluxos permitem que os dados sejam processados ​​em partes.

Principais recursos dos fluxos:

  • Orientado por eventos: Streams são construídos sobre a arquitetura orientada a eventos do Node.js, que permite o processamento de dados assim que estiverem disponíveis.
  • Memória Eficiente: Os fluxos dividem os dados em partes e os processam peça por parte, reduzindo a carga de memória em seu sistema.
  • Sem bloqueio: streams Node.js podem lidar com grandes dados de forma assíncrona sem bloquear o loop de eventos principal.

Tipos de fluxos em Node.js

Node.js fornece quatro tipos de streams:

  1. Streams legíveis: Streams dos quais você pode ler dados.
  2. Streams graváveis: Streams nos quais você pode gravar dados.
  3. Duplex Streams: Streams que são legíveis e graváveis ​​(por exemplo, soquetes de rede).
  4. Transform Streams: Streams que modificam ou transformam os dados durante a leitura ou gravação (por exemplo, compactação ou descompactação de arquivos).

Usando fluxos Node.js.

Vamos explorar cada tipo de stream com exemplos.

3.1 Fluxos Legíveis

Streams legíveis permitem a leitura de dados peça por peça, o que é útil para lidar com arquivos grandes ou fontes de dados em tempo real.


const fs = require('fs');

// Create a readable stream from a large file
const readableStream = fs.createReadStream('largeFile.txt', {
    encoding: 'utf8',
    highWaterMark: 16 * 1024 // 16 KB chunk size
});

readableStream.on('data', (chunk) => {
    console.log('New chunk received:', chunk);
});

readableStream.on('end', () => {
    console.log('Reading file completed');
});


  • Neste exemplo, o método createReadStream lê o arquivo em pedaços de 16 KB.
  • Cada pedaço é processado assim que fica disponível, em vez de esperar que o arquivo inteiro seja carregado na memória.
  • O evento final sinaliza a conclusão do processo de leitura.

3.2 Fluxos graváveis

Streams graváveis são usados ​​para gravar dados de forma incremental em um destino, como um arquivo ou soquete de rede.


const fs = require('fs');

// Create a writable stream to write data to a file
const writableStream = fs.createWriteStream('output.txt');

writableStream.write('Hello, world!\n');
writableStream.write('Writing data chunk by chunk.\n');

// End the stream and close the file
writableStream.end(() => {
    console.log('File writing completed');
});


  • write envia dados para o arquivo de forma incremental.
  • A função final sinaliza que nenhum outro dado será gravado e fecha o fluxo.

3.3 Fluxos Duplex

Um stream duplex pode ler e gravar dados. Um exemplo comum é um soquete TCP, que pode enviar e receber dados simultaneamente.


const net = require('net');

// Create a duplex stream (a simple echo server)
const server = net.createServer((socket) => {
    socket.on('data', (data) => {
        console.log('Received:', data.toString());
        // Echo the data back to the client
        socket.write(`Echo: ${data}`);
    });

    socket.on('end', () => {
        console.log('Connection closed');
    });
});

server.listen(8080, () => {
    console.log('Server listening on port 8080');
});


  • Este exemplo cria um servidor de eco básico que lê os dados recebidos do cliente e os envia de volta.
  • Os fluxos duplex são úteis quando a comunicação bidirecional é necessária, como em protocolos de rede.

3.4 Fluxos de Transformação

Um transform stream é um tipo especial de stream duplex que modifica os dados à medida que eles passam. Um caso de uso comum é a compactação de arquivos.


const fs = require('fs');
const zlib = require('zlib');

// Create a readable stream for a file and a writable stream for the output file
const readable = fs.createReadStream('input.txt');
const writable = fs.createWriteStream('input.txt.gz');

// Create a transform stream that compresses the file
const gzip = zlib.createGzip();

// Pipe the readable stream into the transform stream, then into the writable stream
readable.pipe(gzip).pipe(writable);

writable.on('finish', () => {
    console.log('File successfully compressed');
});


  • O método pipe é usado para direcionar o fluxo de dados de um fluxo para outro.
  • Neste caso, o arquivo é lido, compactado usando Gzip e depois gravado em um novo arquivo.

Casos de uso reais para streams

4.1 Tratamento de arquivos grandes

Ao lidar com arquivos grandes (por exemplo, logs ou mídia), carregar o arquivo inteiro na memória é ineficiente e pode causar problemas de desempenho. Os fluxos permitem que você leia ou grave arquivos grandes de forma incremental, reduzindo a carga na memória.

Exemplo:

  • Caso de uso: um reprodutor de mídia que transmite arquivos de vídeo ou áudio.
  • Solução: o uso de streams garante que o player carregue apenas partes de dados por vez, melhorando o desempenho da reprodução e reduzindo o buffer.

4.2 Processamento de dados em tempo real

Aplicativos em tempo real, como servidores de bate-papo ou painéis ao vivo, precisam processar os dados à medida que eles chegam. Os streams fornecem uma maneira de lidar com esses dados de forma eficiente, reduzindo a latência.

Exemplo:

  • Caso de uso: Um painel de monitoramento de preços de ações.
  • Solução: Streams permitem que o servidor processe os preços das ações recebidas em tempo real e envie atualizações para a interface do usuário.

4.3 Compactação e descompactação de arquivos

A compactação é outro caso de uso comum para streams. Em vez de carregar o arquivo inteiro na memória, você pode compactar dados dinamicamente usando fluxos de transformação.

Exemplo:

  • Caso de uso: Sistemas de backup que compactam arquivos grandes antes de salvá-los.
  • Solução: Streams permitem que os arquivos sejam lidos e compactados de forma incremental, economizando tempo e reduzindo o consumo de memória.

Vantagens de usar fluxos

  1. Eficiência de memória: Streams funcionam em blocos de dados, o que minimiza a memória necessária para processar arquivos grandes ou conjuntos de dados.
  2. Melhor desempenho: o processamento de dados reduz gradativamente o tempo necessário para carregar e processar grandes quantidades de informações.
  3. E/S sem bloqueio: Streams aproveitam a arquitetura assíncrona do Node.js, permitindo que o servidor lide com outras tarefas enquanto os dados estão sendo processados.
  4. Processamento de dados em tempo real: Streams permitem comunicação em tempo real, ideal para aplicações web que exigem transferência de dados de baixa latência.
  5. Flexibilidade: Streams podem ser combinados, canalizados e transformados, tornando-os uma ferramenta poderosa para pipelines complexos de processamento de dados.

Conclusão

Os fluxos

Node.js oferecem uma maneira flexível e eficiente de lidar com grandes quantidades de dados, seja lendo arquivos, processando solicitações de rede ou executando operações em tempo real. Ao dividir os dados em partes gerenciáveis, os fluxos permitem que você trabalhe com grandes conjuntos de dados sem sobrecarregar a memória do sistema.

No próximo artigo, exploraremos NGINX e sua função no fornecimento de conteúdo estático, balanceamento de carga e trabalho como proxy reverso em aplicativos Node.js. Também discutiremos como integrar SSL e criptografia para maior segurança.

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/imsushant12/efficient-data-handling-with-nodejs-streams-4483?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3