"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Manejo eficiente de datos con Node.js Streams

Manejo eficiente de datos con Node.js Streams

Publicado el 2024-11-09
Navegar:160

Efficient Data Handling with Node.js Streams

En este artículo, profundizaremos en Node.js Streams y comprenderemos cómo ayudan a procesar grandes cantidades de datos de manera eficiente. Las transmisiones proporcionan una forma elegante de manejar grandes conjuntos de datos, como leer archivos grandes, transferir datos a través de la red o procesar información en tiempo real. A diferencia de las operaciones de E/S tradicionales que leen o escriben todos los datos a la vez, los flujos dividen los datos en fragmentos manejables y los procesan pieza por pieza, lo que permite un uso eficiente de la memoria.

En este artículo, cubriremos:

  1. ¿Qué son las transmisiones de Node.js?
  2. Diferentes tipos de transmisiones en Node.js.
  3. Cómo crear y utilizar transmisiones.
  4. Casos de uso del mundo real para transmisiones.
  5. Ventajas de usar transmisiones.

¿Qué son las transmisiones de Node.js?

Un flujo en Node.js es un flujo continuo de datos. Las transmisiones son especialmente útiles para manejar tareas vinculadas a E/S, como leer archivos, comunicarse a través de una red o interactuar con bases de datos. En lugar de esperar a que se complete una operación completa, los flujos permiten que los datos se procesen en fragmentos.

Características clave de las transmisiones:

  • Basado en eventos: Las transmisiones se crean sobre la arquitectura basada en eventos de Node.js, que permite procesar datos tan pronto como estén disponibles.
  • Memoria eficiente: las transmisiones dividen los datos en fragmentos y los procesan pieza por pieza, lo que reduce la carga de memoria en su sistema.
  • Sin bloqueo: Las transmisiones de Node.js pueden manejar grandes datos de forma asincrónica sin bloquear el bucle de eventos principal.

Tipos de transmisiones en Node.js

Node.js proporciona cuatro tipos de transmisiones:

  1. Transmisiones legibles: transmisiones desde las que puedes leer datos.
  2. Transmisiones grabables: transmisiones en las que puedes escribir datos.
  3. Transmisiones dúplex: transmisiones que se pueden leer y escribir (por ejemplo, sockets de red).
  4. Transformar flujos: flujos que modifican o transforman los datos mientras se leen o escriben (por ejemplo, comprimiendo o descomprimiendo archivos).

Usando transmisiones de Node.js

Exploremos cada tipo de transmisión con ejemplos.

3.1 Secuencias legibles

Las secuencias legibles le permiten leer datos pieza por pieza, lo cual es útil para manejar archivos grandes o fuentes de datos en tiempo 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');
});


  • En este ejemplo, el método createReadStream lee el archivo en fragmentos de 16 KB.
  • Cada fragmento se procesa tan pronto como está disponible, en lugar de esperar a que todo el archivo se cargue en la memoria.
  • El evento final señala la finalización del proceso de lectura.

3.2 Flujos grabables

Las secuencias de escritura se utilizan para escribir datos de forma incremental en un destino, como un archivo o un socket de red.


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 envía datos al archivo de forma incremental.
  • La función de finalización indica que no se escribirán más datos y cierra la transmisión.

3.3 Flujos dúplex

Una transmisión dúplex puede leer y escribir datos. Un ejemplo común es un socket TCP, que puede enviar y recibir datos simultáneamente.


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 ejemplo crea un servidor de eco básico que lee los datos entrantes del cliente y los devuelve.
  • Las transmisiones dúplex son útiles cuando se necesita comunicación bidireccional, como en los protocolos de red.

3.4 Transformar flujos

Un flujo de transformación es un tipo especial de flujo dúplex que modifica los datos a medida que pasan. Un caso de uso común es la compresión de archivos.


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');
});


  • El método de canalización se utiliza para dirigir el flujo de datos de un flujo a otro.
  • En este caso, el archivo se lee, se comprime usando Gzip y luego se escribe en un archivo nuevo.

Casos de uso del mundo real para transmisiones

4.1 Manejo de archivos grandes

Cuando se trata de archivos grandes (por ejemplo, registros o medios), cargar el archivo completo en la memoria es ineficiente y puede causar problemas de rendimiento. Las transmisiones le permiten leer o escribir archivos grandes de forma incremental, lo que reduce la carga de memoria.

Ejemplo:

  • Caso de uso: Un reproductor multimedia que transmite archivos de vídeo o audio.
  • Solución: El uso de transmisiones garantiza que el reproductor solo cargue fragmentos de datos a la vez, lo que mejora el rendimiento de la reproducción y reduce el almacenamiento en búfer.

4.2 Procesamiento de datos en tiempo real

Las aplicaciones en tiempo real, como servidores de chat o paneles de control en vivo, deben procesar los datos a medida que llegan. Las transmisiones brindan una forma de manejar estos datos de manera eficiente, reduciendo la latencia.

Ejemplo:

  • Caso de uso: Un panel de control del precio de las acciones.
  • Solución: Las transmisiones permiten que el servidor procese los precios de las acciones entrantes en tiempo real y envíe actualizaciones a la interfaz de usuario.

4.3 Compresión y descompresión de archivos

La compresión es otro caso de uso común para las transmisiones. En lugar de cargar el archivo completo en la memoria, puedes comprimir datos sobre la marcha usando flujos de transformación.

Ejemplo:

  • Caso de uso: Sistemas de respaldo que comprimen archivos grandes antes de guardarlos.
  • Solución: Las secuencias permiten leer y comprimir los archivos de forma incremental, ahorrando tiempo y reduciendo el uso de memoria.

Ventajas de utilizar transmisiones

  1. Eficiencia de la memoria: las transmisiones funcionan con fragmentos de datos, lo que minimiza la memoria necesaria para procesar archivos o conjuntos de datos grandes.
  2. Rendimiento mejorado: el procesamiento de datos reduce incrementalmente el tiempo necesario para cargar y procesar grandes cantidades de información.
  3. E/S sin bloqueo: Las transmisiones aprovechan la arquitectura asincrónica de Node.js, lo que permite al servidor manejar otras tareas mientras se procesan los datos.
  4. Procesamiento de datos en tiempo real: Las transmisiones permiten la comunicación en tiempo real, ideal para aplicaciones web que requieren transferencia de datos de baja latencia.
  5. Flexibilidad: Las transmisiones se pueden combinar, canalizar y transformar, lo que las convierte en una poderosa herramienta para procesos de procesamiento de datos complejos.

Conclusión

Las transmisiones de Node.js ofrecen una forma flexible y eficiente de manejar grandes cantidades de datos, ya sea que esté leyendo archivos, procesando solicitudes de red o realizando operaciones en tiempo real. Al dividir los datos en fragmentos manejables, los flujos le permiten trabajar con grandes conjuntos de datos sin saturar la memoria del sistema.

En el próximo artículo, exploraremos NGINX y su función en la distribución de contenido estático, el equilibrio de carga y el funcionamiento como proxy inverso en aplicaciones Node.js. También analizaremos cómo integrar SSL y cifrado para mejorar la seguridad.

Declaración de liberación Este artículo se reproduce en: https://dev.to/imsushant12/ficient-data-handling-with-nodejs-streams-4483?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3