Chunk por Chunk: Procesar grandes cantidades de datos en Node.js

Chunk por Chunk: Procesar grandes cantidades de datos en Node.js

¿Qué son los chunks en los streams?

Los streams son especialmente útiles para el manejo de archivos grandes dimensiones o de dimensiones desconocidas. Suponiendo que queremos leer un archivo de una gran dimensión, podemos especificar que se vaya leyendo a bloques de N bites o chunks.

Stream de tipo lectura

  1. Vamos a llamar el modulo filesystem.

    var fs = require("fs");
    
  2. Definimos el archivo origen que vamos a utilizar.

    var archivo_origen = __dirname + "/texto.txt";
    
  3. Definimos el tamaño en 16 kb, este se multiplica por 1024 para ello.

    var tamano_chunk = 16 * 1024;
    
  4. Vamos a crear un stream con los parámetros antes definidos.

    var stream_lectura = fs.createReadStream(archivo_origen, {
        encoding: "utf8",
        highWaterMark: tamano_chunk,
    });
    
  5. Y creamos un callback que nos notifique cada que estos 16 kb sean leídos.

    stream_lectura.on("data", function (chunk) {
        console.log(chunk.length);
    });
    

    Ahora cada que se complete de leer un bloque, el stream_lectura invocará la función callback que recibe un chunk de 16 kb. Si ejecutamos esto con node veremos que imprime varias veces esta dimensión antes de terminar de leer todo el archivo.

Stream de tipo escritura

Ahora vamos a crear otro stream pero esta ves de tipo escritura.

  1. Definimos nuestro archivo destino.

    var archivo_destino = __dirname + "/texto_destino.txt";
    
  2. Creamos el stream para el archivo destino, y como vamos a usar la misma codificación que el origen, basta don definir solo el archivo a utilizar.

    var stream_escritura = fs.createWriteStream(archivo_destino);
    
  3. Actualizamos el callback para escribir cada que llegue un chunk.

    stream_lectura.on("data", function (chunk) {
        console.log(chunk.length);
        stream_escritura.write(chunk);
    });