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)
UniwersalnyUniwersalny 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)
ZalecanyOpracowany 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 wspolczynnikStworzony 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.
| Metryka | gzip | zstd | Brotli |
|---|---|---|---|
| Wspolczynnik kompresji | Dobry (5-8x) | Bardzo dobry (6-10x) | Doskonaly (7-12x) |
| Szybkosc kompresji | Umiarkowana | Szybka | Wolna do umiarkowanej |
| Szybkosc dekompresji | Umiarkowana | Bardzo szybka | Szybka |
| Zuzycie CPU | Umiarkowane | Niskie do umiarkowanego | Wysokie (na max. poziomie) |
| Obsluga przegladarek | Wszystkie przegladarki | Chrome 123+, Firefox 126+ | Wszystkie nowoczesne przegladarki |
| Obsluga strumieniowania | Tak (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 poziom | Rozmiar skompresowany | Wspolczynnik | Czas kompresji | Czas dekompresji |
|---|---|---|---|---|
| gzip (poziom 6) | 14,2 MB | 7,0x | 2,8s | 0,9s |
| gzip (poziom 9) | 13,1 MB | 7,6x | 8,4s | 0,9s |
| zstd (poziom 3) | 12,8 MB | 7,8x | 0,6s | 0,3s |
| zstd (poziom 1) | 15,1 MB | 6,6x | 0,3s | 0,3s |
| Brotli (poziom 6) | 11,5 MB | 8,7x | 3,2s | 0,5s |
| Brotli (poziom 11) | 9,8 MB | 10,2x | 42,1s | 0,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.
import gzipimport json# === gzip (wbudowany) ===# Zapis skompresowanego 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')# Odczyt skompresowanego 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# Zapis skompresowanego 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')# Odczyt skompresowanego 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# Kompresja calego pliku JSONLwith 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)# Dekompresjawith 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.
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.
# === gzip ===# Kompresja (domyslnie zachowuje oryginal z -k)gzip -k data.jsonl # -> data.jsonl.gzgzip -9 -k data.jsonl # maksymalna kompresja# Dekompresjagzip -d data.jsonl.gz# lub: gunzip data.jsonl.gz# === zstd ===# Instalacja: brew install zstd / apt install zstdzstd data.jsonl # -> data.jsonl.zstzstd -3 data.jsonl # poziom 3 (domyslny)zstd --fast data.jsonl # najszybsza kompresja# Dekompresjazstd -d data.jsonl.zst# lub: unzstd data.jsonl.zst# === Brotli ===# Instalacja: brew install brotli / apt install brotlibrotli data.jsonl # -> data.jsonl.brbrotli -q 6 data.jsonl # jakosc 6brotli -q 11 data.jsonl # maksymalna kompresja# Dekompresjabrotli -d data.jsonl.br# === Potokowanie z jq ===# Kompresja przefiltrowanego JSONLcat data.jsonl | jq -c 'select(.level == "error")' | gzip > errors.jsonl.gz# Dekompresja i liczenie liniizstd -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.
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.
from google.cloud import storageimport gzipimport jsonclient = storage.Client()bucket = client.bucket('my-data-bucket')# Przeslij skompresowany JSONL gzipdef 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.