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)
UniversalEl 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)
RecomendadoDesarrollado 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 ratioCreado 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.
| Metrica | gzip | zstd | Brotli |
|---|---|---|---|
| Ratio de compresion | Bueno (5-8x) | Muy bueno (6-10x) | Excelente (7-12x) |
| Velocidad de compresion | Moderada | Rapida | Lenta a moderada |
| Velocidad de descompresion | Moderada | Muy rapida | Rapida |
| Uso de CPU | Moderado | Bajo a moderado | Alto (en nivel maximo) |
| Soporte de navegadores | Todos los navegadores | Chrome 123+, Firefox 126+ | Todos los navegadores modernos |
| Soporte de streaming | Si (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 nivel | Tamano comprimido | Ratio | Tiempo de compresion | Tiempo de descompresion |
|---|---|---|---|---|
| gzip (nivel 6) | 14.2 MB | 7.0x | 2.8s | 0.9s |
| gzip (nivel 9) | 13.1 MB | 7.6x | 8.4s | 0.9s |
| zstd (nivel 3) | 12.8 MB | 7.8x | 0.6s | 0.3s |
| zstd (nivel 1) | 15.1 MB | 6.6x | 0.3s | 0.3s |
| Brotli (nivel 6) | 11.5 MB | 8.7x | 3.2s | 0.5s |
| Brotli (nivel 11) | 9.8 MB | 10.2x | 42.1s | 0.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.
import gzipimport json# === gzip (built-in) ===# Write compressed JSONLwith 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 JSONLwith 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 JSONLwith 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 JSONLwith 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 filewith 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)# Decompresswith 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.
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.
# === gzip ===# Compress (keeps original by default with -k)gzip -k data.jsonl # -> data.jsonl.gzgzip -9 -k data.jsonl # max compression# Decompressgzip -d data.jsonl.gz# or: gunzip data.jsonl.gz# === zstd ===# Install: brew install zstd / apt install zstdzstd data.jsonl # -> data.jsonl.zstzstd -3 data.jsonl # level 3 (default)zstd --fast data.jsonl # fastest compression# Decompresszstd -d data.jsonl.zst# or: unzstd data.jsonl.zst# === Brotli ===# Install: brew install brotli / apt install brotlibrotli data.jsonl # -> data.jsonl.brbrotli -q 6 data.jsonl # quality 6brotli -q 11 data.jsonl # max compression# Decompressbrotli -d data.jsonl.br# === Piping with jq ===# Compress filtered JSONLcat data.jsonl | jq -c 'select(.level == "error")' | gzip > errors.jsonl.gz# Decompress and count lineszstd -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.
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.
from google.cloud import storageimport gzipimport jsonclient = storage.Client()bucket = client.bucket('my-data-bucket')# Upload gzip-compressed JSONLdef 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.