Compresion JSONL: gzip vs zstd vs Brotli

Una guia practica para comprimir archivos JSONL. Compara ratios de compresion, benchmarks de velocidad, y aprende cuando usar gzip, zstd o Brotli para tus pipelines de datos, almacenamiento en la nube y entrega web.

Ultima actualizacion: febrero 2026

¿Por que comprimir archivos JSONL?

Los archivos JSONL crecen rapido. Un solo dia de logs de aplicacion puede producir gigabytes de JSON delimitado por lineas, y los datasets de aprendizaje automatico alcanzan regularmente decenas de gigabytes. Sin compresion, pagas mas por almacenamiento, las transferencias tardan mas y la E/S se convierte en el cuello de botella de tu pipeline de datos. La compresion no es opcional a escala — es una parte fundamental del trabajo eficiente con datos JSONL.

La buena noticia es que JSONL se comprime excepcionalmente bien. Debido a que JSON es texto repetitivo con claves recurrentes, delimitadores y patrones estructurales, los algoritmos de compresion pueden explotar esta redundancia para lograr una reduccion de tamano de 5x a 15x. El desafio es elegir el algoritmo correcto para tu caso de uso: gzip ofrece compatibilidad universal, zstd entrega el mejor equilibrio velocidad-ratio, y Brotli logra la mayor compresion para activos estaticos. Esta guia compara los tres con benchmarks reales, ejemplos de codigo funcionales y recomendaciones claras.

Descripcion general de algoritmos de compresion

Tres algoritmos dominan el panorama de compresion JSONL. Cada uno usa diferentes estrategias y esta optimizado para diferentes escenarios. Entender sus ventajas y desventajas te ayuda a tomar la decision correcta para tu carga de trabajo especifica.

gzip (DEFLATE)

Universal

El estandar universal. gzip existe desde 1992 y es compatible en todas partes — cada lenguaje de programacion, cada sistema operativo, cada proveedor de nube y cada navegador web. Usa el algoritmo DEFLATE combinando LZ77 y codificacion Huffman. Aunque no es el mas rapido ni el mas eficiente, su ubicuidad lo convierte en la opcion segura por defecto cuando la compatibilidad es lo mas importante.

Zstandard (zstd)

Recomendado

Desarrollado por Facebook en 2016, zstd es el caballo de batalla moderno de la compresion de datos. Comprime y descomprime significativamente mas rapido que gzip mientras logra ratios similares o mejores. Zstd tambien soporta compresion con diccionario, que es especialmente poderosa para archivos JSONL donde cada linea comparte la misma estructura de claves. Es la mejor opcion para pipelines de datos y procesamiento en tiempo real.

Brotli

Mejor ratio

Creado por Google, Brotli logra los ratios de compresion mas altos entre los tres, especialmente en niveles de compresion maxima. Usa una combinacion de LZ77, codificacion Huffman y un diccionario estatico integrado de contenido web comun. Brotli sobresale en comprimir JSONL para entrega HTTP y almacenamiento estatico, pero su velocidad de compresion en niveles altos es notablemente mas lenta que gzip o zstd.

Comparacion directa

La siguiente tabla resume las diferencias clave entre gzip, zstd y Brotli en las metricas que mas importan al comprimir archivos JSONL. Estas son caracteristicas generales con configuraciones por defecto; el rendimiento real varia con los datos y el nivel de compresion.

MetricagzipzstdBrotli
Ratio de compresionBueno (5-8x)Muy bueno (6-10x)Excelente (7-12x)
Velocidad de compresionModeradaRapidaLenta a moderada
Velocidad de descompresionModeradaMuy rapidaRapida
Uso de CPUModeradoBajo a moderadoAlto (en nivel maximo)
Soporte de navegadoresTodos los navegadoresChrome 123+, Firefox 126+Todos los navegadores modernos
Soporte de streamingSi (nativo)Si (nativo)Limitado

Resultados de benchmark: archivo JSONL de 100 MB

Para dar numeros concretos, aqui estan los resultados de benchmark de comprimir un archivo JSONL de 100 MB que contiene registros de log de aplicacion. Cada registro tiene 12 campos incluyendo marcas de tiempo, niveles de log, cadenas de mensaje y objetos de metadatos anidados. Las pruebas se ejecutaron en un AMD Ryzen 7 con 32 GB de RAM y almacenamiento NVMe.

Algoritmo y nivelTamano comprimidoRatioTiempo de compresionTiempo de descompresion
gzip (nivel 6)14.2 MB7.0x2.8s0.9s
gzip (nivel 9)13.1 MB7.6x8.4s0.9s
zstd (nivel 3)12.8 MB7.8x0.6s0.3s
zstd (nivel 1)15.1 MB6.6x0.3s0.3s
Brotli (nivel 6)11.5 MB8.7x3.2s0.5s
Brotli (nivel 11)9.8 MB10.2x42.1s0.4s

Los benchmarks son representativos de datos de log JSONL tipicos. Los resultados varian dependiendo de la cardinalidad de campos, la entropia de valores y la estructura de registros. Los archivos con claves altamente repetitivas y valores de baja entropia (como niveles de log o codigos de estado) se comprimen mejor que aquellos con cadenas unicas de alta entropia.

Ejemplos de codigo de compresion

Aqui tienes ejemplos practicos para comprimir y descomprimir archivos JSONL en Python, Node.js y desde la linea de comandos. Cada ejemplo muestra como trabajar con los tres algoritmos.

Python tiene soporte integrado para gzip. Para zstd y Brotli, instala los paquetes pyzstd y brotli. Los tres siguen el mismo patron: abre un manejador de archivo comprimido, luego lee o escribe lineas JSONL a traves de el.

Python: gzip, zstd y Brotli
import gzip
import json
# === gzip (built-in) ===
# Write compressed JSONL
with gzip.open('data.jsonl.gz', 'wt', encoding='utf-8') as f:
for record in records:
f.write(json.dumps(record, ensure_ascii=False) + '\n')
# Read compressed JSONL
with gzip.open('data.jsonl.gz', 'rt', encoding='utf-8') as f:
for line in f:
record = json.loads(line)
# === zstd (pip install pyzstd) ===
import pyzstd
# Write compressed JSONL
with pyzstd.open('data.jsonl.zst', 'wt', encoding='utf-8') as f:
for record in records:
f.write(json.dumps(record, ensure_ascii=False) + '\n')
# Read compressed JSONL
with pyzstd.open('data.jsonl.zst', 'rt', encoding='utf-8') as f:
for line in f:
record = json.loads(line)
# === Brotli (pip install brotli) ===
import brotli
# Compress an entire JSONL file
with open('data.jsonl', 'rb') as f:
raw = f.read()
compressed = brotli.compress(raw, quality=6)
with open('data.jsonl.br', 'wb') as f:
f.write(compressed)
# Decompress
with open('data.jsonl.br', 'rb') as f:
raw = brotli.decompress(f.read())
for line in raw.decode('utf-8').splitlines():
record = json.loads(line)

Node.js incluye soporte integrado para gzip y Brotli a traves del modulo zlib. Para zstd, usa el paquete npm @aspect-build/zstd o fzstd. La API basada en streams es ideal para procesar archivos JSONL grandes sin cargarlos completamente en memoria.

Node.js: zlib gzip y Brotli
import { createReadStream, createWriteStream } from 'fs';
import { createGzip, createGunzip, createBrotliCompress,
createBrotliDecompress } from 'zlib';
import { createInterface } from 'readline';
import { pipeline } from 'stream/promises';
// === gzip compress ===
await pipeline(
createReadStream('data.jsonl'),
createGzip({ level: 6 }),
createWriteStream('data.jsonl.gz')
);
// === gzip decompress & parse ===
const gunzip = createGunzip();
const rl = createInterface({
input: createReadStream('data.jsonl.gz').pipe(gunzip),
});
for await (const line of rl) {
if (line.trim()) {
const record = JSON.parse(line);
// process record
}
}
// === Brotli compress ===
await pipeline(
createReadStream('data.jsonl'),
createBrotliCompress(),
createWriteStream('data.jsonl.br')
);
// === Brotli decompress & parse ===
const br = createBrotliDecompress();
const rl2 = createInterface({
input: createReadStream('data.jsonl.br').pipe(br),
});
for await (const line of rl2) {
if (line.trim()) {
const record = JSON.parse(line);
}
}

Las herramientas de linea de comandos son la forma mas rapida de comprimir archivos JSONL. gzip viene preinstalado en todos los sistemas Unix. Instala zstd y brotli a traves de tu gestor de paquetes para los otros dos algoritmos.

Linea de comandos: gzip, zstd y Brotli
# === gzip ===
# Compress (keeps original by default with -k)
gzip -k data.jsonl # -> data.jsonl.gz
gzip -9 -k data.jsonl # max compression
# Decompress
gzip -d data.jsonl.gz
# or: gunzip data.jsonl.gz
# === zstd ===
# Install: brew install zstd / apt install zstd
zstd data.jsonl # -> data.jsonl.zst
zstd -3 data.jsonl # level 3 (default)
zstd --fast data.jsonl # fastest compression
# Decompress
zstd -d data.jsonl.zst
# or: unzstd data.jsonl.zst
# === Brotli ===
# Install: brew install brotli / apt install brotli
brotli data.jsonl # -> data.jsonl.br
brotli -q 6 data.jsonl # quality 6
brotli -q 11 data.jsonl # max compression
# Decompress
brotli -d data.jsonl.br
# === Piping with jq ===
# Compress filtered JSONL
cat data.jsonl | jq -c 'select(.level == "error")' | gzip > errors.jsonl.gz
# Decompress and count lines
zstd -dc data.jsonl.zst | wc -l

Estrategias de compresion para almacenamiento en la nube

Al almacenar archivos JSONL en almacenamiento de objetos en la nube, la compresion reduce tanto los costos de almacenamiento como el tiempo de transferencia. La mayoria de los proveedores de nube soportan descompresion transparente para gzip y Brotli a traves de sus capas CDN, pero las estrategias de subida y almacenamiento difieren.

Sube JSONL comprimido a S3 con el encabezado Content-Encoding correcto. S3 almacena los bytes comprimidos, y CloudFront puede servirlos con descompresion automatica. Para cargas de trabajo de data lake, herramientas como AWS Athena y Spark leen nativamente JSONL comprimido con gzip y zstd.

AWS S3 con compresion
guide-jsonl-compression.jsonlCompression.cloudStorage.s3.code

Google Cloud Storage soporta transcodificacion gzip. Cuando subes un objeto comprimido con gzip con el encabezado Content-Encoding: gzip, GCS puede servir la version descomprimida automaticamente cuando los clientes envian Accept-Encoding: gzip. Para importaciones de BigQuery, usa JSONL comprimido con gzip directamente.

Google Cloud Storage con compresion
from google.cloud import storage
import gzip
import json
client = storage.Client()
bucket = client.bucket('my-data-bucket')
# Upload gzip-compressed JSONL
def upload_compressed(records, blob_name):
blob = bucket.blob(f{blob_name}.jsonl.gz)
blob.content_encoding = 'gzip'
blob.content_type = 'application/x-ndjson'
data = '\n'.join(
json.dumps(r, ensure_ascii=False) for r in records
).encode('utf-8')
blob.upload_from_string(
gzip.compress(data),
content_type='application/x-ndjson',
)
# BigQuery: load compressed JSONL directly
# bq load --source_format=NEWLINE_DELIMITED_JSON \
# my_dataset.my_table gs://bucket/data.jsonl.gz schema.json

Mejores practicas: cuando usar que algoritmo

No hay un unico mejor algoritmo de compresion. La eleccion correcta depende de si priorizas el tamano de almacenamiento, la velocidad de procesamiento, la compatibilidad o un equilibrio de los tres. Aqui tienes recomendaciones claras para casos de uso comunes de JSONL.

Archivado y almacenamiento frio

Usa Brotli (calidad 9-11) o zstd (nivel 19+) para compresion maxima.

El tiempo de compresion importa menos para archivado. Comprimes una vez y descomprimes raramente. Brotli a calidad 11 puede lograr compresion 10x+ en datos JSONL, reduciendo significativamente los costos de almacenamiento a largo plazo.

Pipelines de datos en tiempo real

Usa zstd (nivel 1-3) para el mejor equilibrio velocidad-ratio.

En pipelines de streaming (Kafka, Kinesis, Flink), la velocidad de compresion y descompresion afecta directamente el rendimiento y la latencia. Zstd a nivel 1 comprime mas rapido que gzip mientras logra mejores ratios. Su modo de diccionario es ideal para JSONL con esquemas fijos.

Entrega web y APIs

Usa Brotli para archivos estaticos, gzip como respaldo para maxima compatibilidad.

Todos los navegadores modernos soportan Brotli via Accept-Encoding: br. CDNs como Cloudflare y CloudFront pueden comprimir automaticamente con Brotli. Usa gzip como respaldo para clientes antiguos. El soporte de zstd en navegadores esta creciendo pero aun no es universal.

ETL y procesamiento por lotes

Usa gzip para maxima compatibilidad, o zstd para mejor rendimiento.

La mayoria de herramientas de datos (Spark, Athena, BigQuery, pandas) soportan gzip nativamente. El soporte de zstd esta mejorando rapidamente. Si tu cadena de herramientas soporta zstd, prefierelo para compresion 3-5x mas rapida con ratios comparables.

Prueba nuestras herramientas JSONL gratuitas

Comprime tus archivos JSONL antes de subirlos, o validalos y conviertelos usando nuestras herramientas online gratuitas. Sin instalacion necesaria.

Trabaja con archivos JSONL online

Visualiza, valida y convierte archivos JSONL de hasta 1GB directamente en tu navegador. Sin subidas necesarias, 100% privado.

Preguntas frecuentes

Compresión JSONL — gzip vs zstd vs brotli (Benchmarks) | ...