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)
UniverseelDe 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)
AanbevolenOntwikkeld 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 verhoudingGemaakt 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.
| Metriek | gzip | zstd | Brotli |
|---|---|---|---|
| Compressieverhouding | Goed (5-8x) | Zeer goed (6-10x) | Uitstekend (7-12x) |
| Compressiesnelheid | Matig | Snel | Langzaam tot matig |
| Decompressiesnelheid | Matig | Zeer snel | Snel |
| CPU-gebruik | Matig | Laag tot matig | Hoog (bij max niveau) |
| Browserondersteuning | Alle browsers | Chrome 123+, Firefox 126+ | Alle moderne browsers |
| Streamingondersteuning | Ja (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 & niveau | Gecomprimeerde grootte | Verhouding | Compressietijd | Decompressietijd |
|---|---|---|---|---|
| gzip (niveau 6) | 14,2 MB | 7,0x | 2,8s | 0,9s |
| gzip (niveau 9) | 13,1 MB | 7,6x | 8,4s | 0,9s |
| zstd (niveau 3) | 12,8 MB | 7,8x | 0,6s | 0,3s |
| zstd (niveau 1) | 15,1 MB | 6,6x | 0,3s | 0,3s |
| Brotli (niveau 6) | 11,5 MB | 8,7x | 3,2s | 0,5s |
| Brotli (niveau 11) | 9,8 MB | 10,2x | 42,1s | 0,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.
import gzipimport json# === gzip (ingebouwd) ===# Schrijf gecomprimeerde 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')# Lees gecomprimeerde 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# Schrijf gecomprimeerde 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')# Lees gecomprimeerde 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# Comprimeer een heel JSONL-bestandwith 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)# Decomprimeerwith 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.
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.
# === gzip ===# Comprimeren (behoudt origineel standaard met -k)gzip -k data.jsonl # -> data.jsonl.gzgzip -9 -k data.jsonl # maximale compressie# Decomprimerengzip -d data.jsonl.gz# of: gunzip data.jsonl.gz# === zstd ===# Installeren: brew install zstd / apt install zstdzstd data.jsonl # -> data.jsonl.zstzstd -3 data.jsonl # niveau 3 (standaard)zstd --fast data.jsonl # snelste compressie# Decomprimerenzstd -d data.jsonl.zst# of: unzstd data.jsonl.zst# === Brotli ===# Installeren: brew install brotli / apt install brotlibrotli data.jsonl # -> data.jsonl.brbrotli -q 6 data.jsonl # kwaliteit 6brotli -q 11 data.jsonl # maximale compressie# Decomprimerenbrotli -d data.jsonl.br# === Piping met jq ===# Comprimeer gefilterde JSONLcat data.jsonl | jq -c 'select(.level == "error")' | gzip > errors.jsonl.gz# Decomprimeer en tel regelszstd -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.
import boto3import gzipimport jsons3 = boto3.client('s3')# Upload gzip-gecomprimeerde JSONL naar S3def upload_compressed_jsonl(records, bucket, key):# Comprimeer in geheugencompressed = 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 decomprimeerdef 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.
from google.cloud import storageimport gzipimport jsonclient = storage.Client()bucket = client.bucket('my-data-bucket')# Upload gzip-gecomprimeerde 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: 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.