JSONL-compressie: gzip vs zstd vs Brotli

Een praktische gids voor het comprimeren van JSONL-bestanden. Vergelijk compressieverhoudingen, snelheidsbenchmarks en leer wanneer je gzip, zstd of Brotli moet gebruiken voor je data-pipelines, cloudopslag en weblevering.

Laatst bijgewerkt: februari 2026

Waarom JSONL-bestanden comprimeren?

JSONL-bestanden groeien snel. Een enkele dag aan applicatielogs kan gigabytes aan regelgescheiden JSON produceren, en machine learning-datasets bereiken routinematig tientallen gigabytes. Zonder compressie betaal je meer voor opslag, duren overdrachten langer en wordt I/O het knelpunt in je data-pipeline. Compressie is niet optioneel op schaal — het is een fundamenteel onderdeel van efficiënt werken met JSONL-data.

Het goede nieuws is dat JSONL uitzonderlijk goed comprimeert. Omdat JSON repetitieve tekst is met terugkerende sleutels, scheidingstekens en structurele patronen, kunnen compressiealgoritmen deze redundantie benutten om 5x tot 15x groottereductie te bereiken. De uitdaging is het kiezen van het juiste algoritme voor jouw use case: gzip biedt universele compatibiliteit, zstd levert de beste snelheid-tot-verhouding afweging, en Brotli bereikt de hoogste compressie voor statische assets. Deze gids vergelijkt alle drie met echte benchmarks, werkende codevoorbeelden en duidelijke aanbevelingen.

Overzicht compressiealgoritmen

Drie algoritmen domineren het JSONL-compressielandschap. Elk gebruikt verschillende strategieën en is geoptimaliseerd voor verschillende scenario's. Het begrijpen van hun afwegingen helpt je de juiste keuze te maken voor je specifieke workload.

gzip (DEFLATE)

Universeel

De universele standaard. gzip bestaat sinds 1992 en wordt overal ondersteund — elke programmeertaal, elk besturingssysteem, elke cloudprovider en elke webbrowser. Het gebruikt het DEFLATE-algoritme dat LZ77 en Huffman-codering combineert. Hoewel niet het snelst of efficiëntst, maakt de alomtegenwoordigheid het de veilige standaardkeuze wanneer compatibiliteit het belangrijkst is.

Zstandard (zstd)

Aanbevolen

Ontwikkeld door Facebook in 2016, zstd is het moderne werkpaard van datacompressie. Het comprimeert en decomprimeert aanzienlijk sneller dan gzip terwijl het vergelijkbare of betere verhoudingen bereikt. Zstd ondersteunt ook dictionarycompressie, wat bijzonder krachtig is voor JSONL-bestanden waar elke regel dezelfde sleutelstructuur deelt. Het is de beste keuze voor data-pipelines en realtime verwerking.

Brotli

Beste verhouding

Gemaakt door Google, Brotli bereikt de hoogste compressieverhoudingen van de drie, vooral op maximale compressieniveaus. Het gebruikt een combinatie van LZ77, Huffman-codering en een ingebouwd statisch woordenboek van veelvoorkomende webcontent. Brotli blinkt uit bij het comprimeren van JSONL voor HTTP-levering en statische opslag, maar de compressiesnelheid op hoge niveaus is merkbaar langzamer dan gzip of zstd.

Vergelijking naast elkaar

De volgende tabel vat de belangrijkste verschillen samen tussen gzip, zstd en Brotli op de metrics die het meest van belang zijn bij het comprimeren van JSONL-bestanden. Dit zijn algemene kenmerken bij standaardinstellingen; werkelijke prestaties variëren met data en compressieniveau.

MetriekgzipzstdBrotli
CompressieverhoudingGoed (5-8x)Zeer goed (6-10x)Uitstekend (7-12x)
CompressiesnelheidMatigSnelLangzaam tot matig
DecompressiesnelheidMatigZeer snelSnel
CPU-gebruikMatigLaag tot matigHoog (bij max niveau)
BrowserondersteuningAlle browsersChrome 123+, Firefox 126+Alle moderne browsers
StreamingondersteuningJa (native)Ja (native)Beperkt

Benchmarkresultaten: 100 MB JSONL-bestand

Om concrete cijfers te geven, hier zijn benchmarkresultaten van het comprimeren van een 100 MB JSONL-bestand met applicatielogrecords. Elk record heeft 12 velden inclusief timestamps, logniveaus, berichtstrings en geneste metadata-objecten. Tests zijn uitgevoerd op een AMD Ryzen 7 met 32 GB RAM en NVMe-opslag.

Algoritme & niveauGecomprimeerde grootteVerhoudingCompressietijdDecompressietijd
gzip (niveau 6)14,2 MB7,0x2,8s0,9s
gzip (niveau 9)13,1 MB7,6x8,4s0,9s
zstd (niveau 3)12,8 MB7,8x0,6s0,3s
zstd (niveau 1)15,1 MB6,6x0,3s0,3s
Brotli (niveau 6)11,5 MB8,7x3,2s0,5s
Brotli (niveau 11)9,8 MB10,2x42,1s0,4s

Benchmarks zijn representatief voor typische JSONL-logdata. Resultaten variëren afhankelijk van veldcardinaliteit, waarde-entropie en recordstructuur. Bestanden met zeer repetitieve sleutels en lage-entropie waarden (zoals logniveaus of statuscodes) comprimeren beter dan die met unieke strings met hoge entropie.

Codevoorbeelden voor compressie

Hier zijn praktische voorbeelden voor het comprimeren en decomprimeren van JSONL-bestanden in Python, Node.js en vanaf de commandoregel. Elk voorbeeld laat zien hoe je met alle drie de algoritmen werkt.

Python heeft ingebouwde gzip-ondersteuning. Voor zstd en Brotli installeer je de pyzstd- en brotli-pakketten. Alle drie volgen hetzelfde patroon: open een gecomprimeerde bestandshandle en lees of schrijf er vervolgens JSONL-regels doorheen.

Python: gzip, zstd & Brotli
import gzip
import json
# === gzip (ingebouwd) ===
# Schrijf gecomprimeerde 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')
# Lees gecomprimeerde 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
# Schrijf gecomprimeerde 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')
# Lees gecomprimeerde 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
# Comprimeer een heel JSONL-bestand
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)
# Decomprimeer
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 bevat ingebouwde ondersteuning voor zowel gzip als Brotli via de zlib-module. Voor zstd gebruik je het @aspect-build/zstd of fzstd npm-pakket. De stream-gebaseerde API is ideaal voor het verwerken van grote JSONL-bestanden zonder ze volledig in het geheugen te laden.

Node.js: zlib gzip & Brotli
import { createReadStream, createWriteStream } from 'fs';
import { createGzip, createGunzip, createBrotliCompress,
createBrotliDecompress } from 'zlib';
import { createInterface } from 'readline';
import { pipeline } from 'stream/promises';
// === gzip comprimeren ===
await pipeline(
createReadStream('data.jsonl'),
createGzip({ level: 6 }),
createWriteStream('data.jsonl.gz')
);
// === gzip decomprimeren & parseren ===
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);
// verwerk record
}
}
// === Brotli comprimeren ===
await pipeline(
createReadStream('data.jsonl'),
createBrotliCompress(),
createWriteStream('data.jsonl.br')
);
// === Brotli decomprimeren & parseren ===
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);
}
}

Commandoregeltools zijn de snelste manier om JSONL-bestanden te comprimeren. gzip is voorgeïnstalleerd op alle Unix-systemen. Installeer zstd en brotli via je pakketbeheerder voor de andere twee algoritmen.

Commandoregel: gzip, zstd & Brotli
# === gzip ===
# Comprimeren (behoudt origineel standaard met -k)
gzip -k data.jsonl # -> data.jsonl.gz
gzip -9 -k data.jsonl # maximale compressie
# Decomprimeren
gzip -d data.jsonl.gz
# of: gunzip data.jsonl.gz
# === zstd ===
# Installeren: brew install zstd / apt install zstd
zstd data.jsonl # -> data.jsonl.zst
zstd -3 data.jsonl # niveau 3 (standaard)
zstd --fast data.jsonl # snelste compressie
# Decomprimeren
zstd -d data.jsonl.zst
# of: unzstd data.jsonl.zst
# === Brotli ===
# Installeren: brew install brotli / apt install brotli
brotli data.jsonl # -> data.jsonl.br
brotli -q 6 data.jsonl # kwaliteit 6
brotli -q 11 data.jsonl # maximale compressie
# Decomprimeren
brotli -d data.jsonl.br
# === Piping met jq ===
# Comprimeer gefilterde JSONL
cat data.jsonl | jq -c 'select(.level == "error")' | gzip > errors.jsonl.gz
# Decomprimeer en tel regels
zstd -dc data.jsonl.zst | wc -l

Cloudopslag-compressiestrategieën

Bij het opslaan van JSONL-bestanden in cloud-objectopslag vermindert compressie zowel opslagkosten als overdrachtstijd. De meeste cloudproviders ondersteunen transparante decompressie voor gzip en Brotli via hun CDN-lagen, maar de upload- en opslagstrategieën verschillen.

Upload gecomprimeerde JSONL naar S3 met de juiste Content-Encoding header. S3 slaat de gecomprimeerde bytes op, en CloudFront kan ze serveren met automatische decompressie. Voor data lake-workloads lezen tools zoals AWS Athena en Spark native gzip- en zstd-gecomprimeerde JSONL.

AWS S3 met compressie
import boto3
import gzip
import json
s3 = boto3.client('s3')
# Upload gzip-gecomprimeerde JSONL naar S3
def upload_compressed_jsonl(records, bucket, key):
# Comprimeer in geheugen
compressed = gzip.compress(
'\n'.join(
json.dumps(r, ensure_ascii=False) for r in records
).encode('utf-8')
)
s3.put_object(
Bucket=bucket,
Key=f{key}.jsonl.gz,
Body=compressed,
ContentType='application/x-ndjson',
ContentEncoding='gzip',
)
print(f{len(compressed)} bytes geüpload (gecomprimeerd))
# Download en decomprimeer
def download_compressed_jsonl(bucket, key):
response = s3.get_object(Bucket=bucket, Key=key)
raw = gzip.decompress(response['Body'].read())
return [
json.loads(line)
for line in raw.decode('utf-8').splitlines()
if line.strip()
]

Google Cloud Storage ondersteunt gzip-transcodering. Wanneer je een gzip-gecomprimeerd object uploadt met de Content-Encoding: gzip header, kan GCS de gedecomprimeerde versie automatisch serveren wanneer clients Accept-Encoding: gzip sturen. Voor BigQuery-imports gebruik je gzip-gecomprimeerde JSONL direct.

Google Cloud Storage met compressie
from google.cloud import storage
import gzip
import json
client = storage.Client()
bucket = client.bucket('my-data-bucket')
# Upload gzip-gecomprimeerde 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: laad gecomprimeerde JSONL direct
# bq load --source_format=NEWLINE_DELIMITED_JSON \
# my_dataset.my_table gs://bucket/data.jsonl.gz schema.json

Best practices: wanneer welk algoritme gebruiken

Er is geen enkel beste compressiealgoritme. De juiste keuze hangt af van of je prioriteit geeft aan opslaggrootte, verwerkingssnelheid, compatibiliteit of een balans van alle drie. Hier zijn duidelijke aanbevelingen voor veelvoorkomende JSONL-use cases.

Archivering & koude opslag

Gebruik Brotli (kwaliteit 9-11) of zstd (niveau 19+) voor maximale compressie.

Compressietijd is minder belangrijk voor archivering. Je comprimeert eenmalig en decomprimeert zelden. Brotli op kwaliteit 11 kan 10x+ compressie bereiken op JSONL-data, wat de langetermijn opslagkosten aanzienlijk verlaagt.

Realtime data-pipelines

Gebruik zstd (niveau 1-3) voor de beste snelheid-tot-verhouding afweging.

In streamingpipelines (Kafka, Kinesis, Flink) beïnvloeden compressie- en decompressiesnelheid direct de doorvoer en latentie. Zstd op niveau 1 comprimeert sneller dan gzip terwijl het betere verhoudingen bereikt. De dictionarymodus is ideaal voor JSONL met vaste schema's.

Weblevering & API's

Gebruik Brotli voor statische bestanden, gzip als terugval voor maximale compatibiliteit.

Alle moderne browsers ondersteunen Brotli via Accept-Encoding: br. CDN's zoals Cloudflare en CloudFront kunnen automatisch comprimeren met Brotli. Gebruik gzip als terugval voor oudere clients. Zstd-browserondersteuning groeit maar is nog niet universeel.

ETL & batchverwerking

Gebruik gzip voor maximale compatibiliteit, of zstd voor betere prestaties.

De meeste datatools (Spark, Athena, BigQuery, pandas) ondersteunen gzip native. Zstd-ondersteuning verbetert snel. Als je toolchain zstd ondersteunt, geef er dan de voorkeur aan voor 3-5x snellere compressie met vergelijkbare verhoudingen.

Probeer onze gratis JSONL-tools

Comprimeer je JSONL-bestanden voor het uploaden, of valideer en converteer ze met onze gratis online tools. Geen installatie vereist.

Werk online met JSONL-bestanden

Bekijk, valideer en converteer JSONL-bestanden tot 1GB direct in je browser. Geen uploads nodig, 100% privé.

Veelgestelde vragen

JSONL-compressie — gzip vs zstd vs brotli (benchmarks) | ...