Kompresja JSONL: gzip vs zstd vs Brotli

Praktyczny przewodnik kompresji plikow JSONL. Porownaj wspolczynniki kompresji, benchmarki szybkosci i dowiedz sie, kiedy uzywac gzip, zstd lub Brotli do potokow danych, przechowywania w chmurze i dostarczania webowego.

Ostatnia aktualizacja: luty 2026

Dlaczego kompresowac pliki JSONL?

Pliki JSONL szybko rosna. Pojedynczy dzien logow aplikacji moze wygenerowac gigabajty JSON rozdzielonego liniami, a zbiory danych uczenia maszynowego rutynowo osiagaja dziesiatki gigabajtow. Bez kompresji placisz wiecej za przechowywanie, transfery trwaja dluzej, a I/O staje sie waskim gardlem w Twoim potoku danych. Kompresja nie jest opcjonalna w duzej skali — jest fundamentalna czescia wydajnej pracy z danymi JSONL.

Dobra wiadomosc jest taka, ze JSONL kompresuje sie wyjatkowo dobrze. Poniewaz JSON jest powtarzalnym tekstem z powracajacymi kluczami, ogranicznikami i wzorcami strukturalnymi, algorytmy kompresji moga wykorzystac te redundancje, aby osiagnac 5x do 15x zmniejszenie rozmiaru. Wyzwaniem jest wybranie odpowiedniego algorytmu do Twojego przypadku uzycia: gzip oferuje uniwersalna kompatybilnosc, zstd zapewnia najlepszy kompromis miedzy szybkoscia a wspolczynnikiem, a Brotli osiaga najwyzsza kompresje dla zasobow statycznych. Ten przewodnik porownuje wszystkie trzy z prawdziwymi benchmarkami, dzialajacymi przykladami kodu i jasnymi rekomendacjami.

Przeglad algorytmow kompresji

Trzy algorytmy dominuja w krajobrazie kompresji JSONL. Kazdy uzywa roznych strategii i jest zoptymalizowany do roznych scenariuszy. Zrozumienie ich kompromisow pomaga dokonac wlasciwego wyboru dla konkretnego obciazenia.

gzip (DEFLATE)

Uniwersalny

Uniwersalny standard. gzip istnieje od 1992 roku i jest obslugiwany wszedzie — w kazdym jezyku programowania, kazdym systemie operacyjnym, kazdym dostawcy chmury i kazdej przegladarce. Uzywa algorytmu DEFLATE laczacego LZ77 i kodowanie Huffmana. Choc nie jest najszybszy ani najwydajniejszy, jego wszechobecnosc czyni go bezpiecznym domyslnym wyborem, gdy kompatybilnosc jest najwazniejsza.

Zstandard (zstd)

Zalecany

Opracowany przez Facebook w 2016 roku, zstd to nowoczesny kolos kompresji danych. Kompresuje i dekompresuje znacznie szybciej niz gzip, osiagajac podobne lub lepsze wspolczynniki. Zstd obsluguje rowniez kompresje slownikowa, ktora jest szczegolnie potezna dla plikow JSONL, gdzie kazda linia wspoldziela te sama strukture kluczy. Jest najlepszym wyborem dla potokow danych i przetwarzania w czasie rzeczywistym.

Brotli

Najlepszy wspolczynnik

Stworzony przez Google, Brotli osiaga najwyzsze wspolczynniki kompresji sposrod tych trzech, szczegolnie przy maksymalnych poziomach. Uzywa kombinacji LZ77, kodowania Huffmana i wbudowanego statycznego slownika popularnych tresci webowych. Brotli celuje w kompresji JSONL do dostarczania HTTP i statycznego przechowywania, ale jego szybkosc kompresji na wysokich poziomach jest znacznie wolniejsza niz gzip lub zstd.

Bezposrednie porownanie

Ponizsze zestawienie podsumowuje kluczowe roznice miedzy gzip, zstd i Brotli w metrykach najwazniejszych przy kompresji plikow JSONL. Sa to ogolne charakterystyki przy domyslnych ustawieniach; rzeczywista wydajnosc rozni sie w zaleznosci od danych i poziomu kompresji.

MetrykagzipzstdBrotli
Wspolczynnik kompresjiDobry (5-8x)Bardzo dobry (6-10x)Doskonaly (7-12x)
Szybkosc kompresjiUmiarkowanaSzybkaWolna do umiarkowanej
Szybkosc dekompresjiUmiarkowanaBardzo szybkaSzybka
Zuzycie CPUUmiarkowaneNiskie do umiarkowanegoWysokie (na max. poziomie)
Obsluga przegladarekWszystkie przegladarkiChrome 123+, Firefox 126+Wszystkie nowoczesne przegladarki
Obsluga strumieniowaniaTak (natywna)Tak (natywna)Ograniczona

Wyniki benchmarkow: plik JSONL 100 MB

Aby podac konkretne liczby, oto wyniki benchmarkow z kompresji pliku JSONL o rozmiarze 100 MB zawierajacego rekordy logow aplikacji. Kazdy rekord ma 12 pol, w tym znaczniki czasu, poziomy logow, ciagi wiadomosci i zagniezdzene obiekty metadanych. Testy przeprowadzono na AMD Ryzen 7 z 32 GB RAM i dyskiem NVMe.

Algorytm i poziomRozmiar skompresowanyWspolczynnikCzas kompresjiCzas dekompresji
gzip (poziom 6)14,2 MB7,0x2,8s0,9s
gzip (poziom 9)13,1 MB7,6x8,4s0,9s
zstd (poziom 3)12,8 MB7,8x0,6s0,3s
zstd (poziom 1)15,1 MB6,6x0,3s0,3s
Brotli (poziom 6)11,5 MB8,7x3,2s0,5s
Brotli (poziom 11)9,8 MB10,2x42,1s0,4s

Benchmarki sa reprezentatywne dla typowych danych logow JSONL. Wyniki roznia sie w zaleznosci od kardynalnosci pol, entropii wartosci i struktury rekordow. Pliki z wysoce powtarzalnymi kluczami i wartosciami o niskiej entropii (takimi jak poziomy logow lub kody statusow) kompresuja sie lepiej niz te z unikalnymi ciagami o wysokiej entropii.

Przyklady kodu kompresji

Oto praktyczne przyklady kompresji i dekompresji plikow JSONL w Python, Node.js i z wiersza polecen. Kazdy przyklad pokazuje, jak pracowac ze wszystkimi trzema algorytmami.

Python ma wbudowana obsluge gzip. Dla zstd i Brotli zainstaluj pakiety pyzstd i brotli. Wszystkie trzy podazaja za tym samym wzorcem: otworz skompresowany uchwyt pliku, a nastepnie czytaj lub zapisuj linie JSONL przez niego.

Python: gzip, zstd i Brotli
import gzip
import json
# === gzip (wbudowany) ===
# Zapis skompresowanego 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')
# Odczyt skompresowanego 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
# Zapis skompresowanego 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')
# Odczyt skompresowanego 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
# Kompresja calego pliku JSONL
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)
# Dekompresja
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 ma wbudowana obsluge zarowno gzip, jak i Brotli poprzez modul zlib. Dla zstd uzyj pakietu npm @aspect-build/zstd lub fzstd. API oparte na strumieniach jest idealne do przetwarzania duzych plikow JSONL bez ladowania ich calkowicie do pamieci.

Node.js: zlib gzip i Brotli
import { createReadStream, createWriteStream } from 'fs';
import { createGzip, createGunzip, createBrotliCompress,
createBrotliDecompress } from 'zlib';
import { createInterface } from 'readline';
import { pipeline } from 'stream/promises';
// === kompresja gzip ===
await pipeline(
createReadStream('data.jsonl'),
createGzip({ level: 6 }),
createWriteStream('data.jsonl.gz')
);
// === dekompresja gzip i parsowanie ===
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);
// przetwarzaj rekord
}
}
// === kompresja Brotli ===
await pipeline(
createReadStream('data.jsonl'),
createBrotliCompress(),
createWriteStream('data.jsonl.br')
);
// === dekompresja Brotli i parsowanie ===
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);
}
}

Narzedzia wiersza polecen to najszybszy sposob kompresji plikow JSONL. gzip jest preinstalowany na wszystkich systemach Unix. Zainstaluj zstd i brotli za pomoca menedzera pakietow dla pozostalych dwoch algorytmow.

Wiersz polecen: gzip, zstd i Brotli
# === gzip ===
# Kompresja (domyslnie zachowuje oryginal z -k)
gzip -k data.jsonl # -> data.jsonl.gz
gzip -9 -k data.jsonl # maksymalna kompresja
# Dekompresja
gzip -d data.jsonl.gz
# lub: gunzip data.jsonl.gz
# === zstd ===
# Instalacja: brew install zstd / apt install zstd
zstd data.jsonl # -> data.jsonl.zst
zstd -3 data.jsonl # poziom 3 (domyslny)
zstd --fast data.jsonl # najszybsza kompresja
# Dekompresja
zstd -d data.jsonl.zst
# lub: unzstd data.jsonl.zst
# === Brotli ===
# Instalacja: brew install brotli / apt install brotli
brotli data.jsonl # -> data.jsonl.br
brotli -q 6 data.jsonl # jakosc 6
brotli -q 11 data.jsonl # maksymalna kompresja
# Dekompresja
brotli -d data.jsonl.br
# === Potokowanie z jq ===
# Kompresja przefiltrowanego JSONL
cat data.jsonl | jq -c 'select(.level == "error")' | gzip > errors.jsonl.gz
# Dekompresja i liczenie linii
zstd -dc data.jsonl.zst | wc -l

Strategie kompresji w przechowywaniu chmurowym

Przechowujac pliki JSONL w chmurowym magazynie obiektow, kompresja zmniejsza zarowno koszty przechowywania, jak i czas transferu. Wiekszosc dostawcow chmury obsluguje transparentna dekompresje dla gzip i Brotli przez warstwy CDN, ale strategie przesylania i przechowywania sie roznia.

Przesylaj skompresowane JSONL do S3 z poprawnym naglowkiem Content-Encoding. S3 przechowuje skompresowane bajty, a CloudFront moze serwowac je z automatyczna dekompresja. Dla obciazen jeziora danych narzedzia takie jak AWS Athena i Spark natywnie czytaja JSONL skompresowane gzip i zstd.

AWS S3 z kompresja
guide-jsonl-compression.jsonlCompression.cloudStorage.s3.code

Google Cloud Storage obsluguje transkodowanie gzip. Gdy przesylasz skompresowany gzip obiekt z naglowkiem Content-Encoding: gzip, GCS moze automatycznie serwowac zdekompresowana wersje, gdy klienci wysylaja Accept-Encoding: gzip. Dla importow BigQuery uzyj bezposrednio JSONL skompresowanego gzip.

Google Cloud Storage z kompresja
from google.cloud import storage
import gzip
import json
client = storage.Client()
bucket = client.bucket('my-data-bucket')
# Przeslij skompresowany JSONL gzip
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: laduj skompresowany JSONL bezposrednio
# bq load --source_format=NEWLINE_DELIMITED_JSON \
# my_dataset.my_table gs://bucket/data.jsonl.gz schema.json

Najlepsze praktyki: kiedy uzywac ktorego algorytmu

Nie ma jednego najlepszego algorytmu kompresji. Wlasciwy wybor zalezy od tego, czy priorytetem jest rozmiar przechowywania, szybkosc przetwarzania, kompatybilnosc, czy rownoważenie wszystkich trzech. Oto jasne rekomendacje dla typowych przypadkow uzycia JSONL.

Archiwizacja i zimne przechowywanie

Uzyj Brotli (jakosc 9-11) lub zstd (poziom 19+) dla maksymalnej kompresji.

Czas kompresji ma mniejsze znaczenie dla archiwizacji. Kompresujesz raz i dekompresjesz rzadko. Brotli przy jakosci 11 moze osiagnac 10x+ kompresje na danych JSONL, znacznie zmniejszajac dlugoterminowe koszty przechowywania.

Potoki danych w czasie rzeczywistym

Uzyj zstd (poziom 1-3) dla najlepszego kompromisu miedzy szybkoscia a wspolczynnikiem.

W potokach strumieniowych (Kafka, Kinesis, Flink) szybkosc kompresji i dekompresji bezposrednio wplywa na przepustowosc i opoznienie. Zstd na poziomie 1 kompresuje szybciej niz gzip, osiagajac lepsze wspolczynniki. Tryb slownikowy jest idealny dla JSONL z ustalonym schematem.

Dostarczanie webowe i API

Uzyj Brotli dla plikow statycznych, gzip jako rezerwowego dla maksymalnej kompatybilnosci.

Wszystkie nowoczesne przegladarki obsluguja Brotli przez Accept-Encoding: br. CDN-y takie jak Cloudflare i CloudFront moga automatycznie kompresowac z Brotli. Uzyj gzip jako rezerwowego dla starszych klientow. Obsluga zstd w przegladarkach rosnie, ale nie jest jeszcze uniwersalna.

ETL i przetwarzanie wsadowe

Uzyj gzip dla maksymalnej kompatybilnosci lub zstd dla lepszej wydajnosci.

Wiekszosc narzedzi do danych (Spark, Athena, BigQuery, pandas) obsluguje gzip natywnie. Obsluga zstd szybko sie poprawia. Jesli Twoj zestaw narzedzi obsluguje zstd, preferuj go dla 3-5x szybszej kompresji z porownywalnymi wspolczynnikami.

Wyprobuj nasze darmowe narzedzia JSONL

Skompresuj pliki JSONL przed przeslaniem lub zwaliduj je i skonwertuj za pomoca naszych darmowych narzedzi online. Bez koniecznosci instalacji.

Pracuj z plikami JSONL online

Przegladaj, waliduj i konwertuj pliki JSONL do 1GB bezposrednio w przegladarce. Bez przesylania, 100% prywatnosci.

Czesto zadawane pytania

Kompresja JSONL — gzip vs zstd vs brotli (benchmarki) | j...