JSONL 壓縮:gzip vs zstd vs Brotli
壓縮 JSONL 檔案的實用指南。比較壓縮比率、速度基準測試,以及了解何時在資料管線、雲端儲存和網路傳輸中使用 gzip、zstd 或 Brotli。
最後更新:2026 年 2 月
為什麼要壓縮 JSONL 檔案?
JSONL 檔案增長速度很快。一天的應用程式日誌可以產生數 GB 的行分隔 JSON,而機器學習資料集通常達到數十 GB。沒有壓縮,你需要為儲存支付更多費用、傳輸花費更長時間,且 I/O 成為資料管線的瓶頸。在大規模場景下,壓縮不是可選的 — 它是高效處理 JSONL 資料的基本部分。
好消息是 JSONL 壓縮效果非常好。因為 JSON 是具有重複鍵、分隔符號和結構模式的重複性文字,壓縮演算法可以利用這種冗餘性實現 5 到 15 倍的大小縮減。挑戰在於選擇適合你使用場景的正確演算法:gzip 提供通用相容性、zstd 提供最佳的速度與比率平衡、Brotli 為靜態資源實現最高壓縮率。本指南使用真實的基準測試、可用的程式碼範例和明確的建議比較這三者。
壓縮演算法概覽
三種演算法主導 JSONL 壓縮領域。每種使用不同的策略,並針對不同的場景進行最佳化。了解它們的取捨有助於你為特定工作負載做出正確的選擇。
gzip (DEFLATE)
通用通用標準。gzip 自 1992 年以來一直存在,且在所有地方都被支援 — 每種程式語言、每個作業系統、每個雲端供應商和每個網路瀏覽器。它使用結合 LZ77 和 Huffman 編碼的 DEFLATE 演算法。雖然不是最快或最高效的,但其普遍性使它成為相容性最重要時的安全預設選擇。
Zstandard (zstd)
推薦由 Facebook 於 2016 年開發,zstd 是現代資料壓縮的主力。它的壓縮和解壓縮速度明顯快於 gzip,同時實現相似或更好的比率。Zstd 還支援字典壓縮,這對 JSONL 檔案特別強大,因為每行都共用相同的鍵結構。它是資料管線和即時處理的最佳選擇。
Brotli
最佳比率由 Google 建立,Brotli 在三者中實現最高的壓縮比率,尤其在最大壓縮等級時。它使用 LZ77、Huffman 編碼和內建的常見網路內容靜態字典的組合。Brotli 擅長壓縮用於 HTTP 傳輸和靜態儲存的 JSONL,但其在高等級時的壓縮速度明顯慢於 gzip 或 zstd。
直接比較
下表總結了 gzip、zstd 和 Brotli 在壓縮 JSONL 檔案時最重要的指標上的關鍵差異。這些是預設設定下的一般特性;實際效能因資料和壓縮等級而異。
| 指標 | gzip | zstd | Brotli |
|---|---|---|---|
| 壓縮比率 | 良好 (5-8x) | 很好 (6-10x) | 優秀 (7-12x) |
| 壓縮速度 | 中等 | 快 | 慢到中等 |
| 解壓縮速度 | 中等 | 非常快 | 快 |
| CPU 使用率 | 中等 | 低到中等 | 高(最大等級時) |
| 瀏覽器支援 | 所有瀏覽器 | Chrome 123+、Firefox 126+ | 所有現代瀏覽器 |
| 串流支援 | 是(原生) | 是(原生) | 有限 |
基準測試結果:100 MB JSONL 檔案
為提供具體數字,以下是壓縮一個包含應用程式日誌記錄的 100 MB JSONL 檔案的基準測試結果。每筆記錄有 12 個欄位,包括時間戳記、日誌等級、訊息字串和巢狀中繼資料物件。測試在 AMD Ryzen 7、32 GB RAM 和 NVMe 儲存上執行。
| 演算法與等級 | 壓縮後大小 | 比率 | 壓縮時間 | 解壓縮時間 |
|---|---|---|---|---|
| gzip(等級 6) | 14.2 MB | 7.0x | 2.8s | 0.9s |
| gzip(等級 9) | 13.1 MB | 7.6x | 8.4s | 0.9s |
| zstd(等級 3) | 12.8 MB | 7.8x | 0.6s | 0.3s |
| zstd(等級 1) | 15.1 MB | 6.6x | 0.3s | 0.3s |
| Brotli(等級 6) | 11.5 MB | 8.7x | 3.2s | 0.5s |
| Brotli(等級 11) | 9.8 MB | 10.2x | 42.1s | 0.4s |
基準測試代表典型的 JSONL 日誌資料。結果因欄位基數、值熵和記錄結構而異。具有高重複鍵和低熵值(如日誌等級或狀態碼)的檔案壓縮效果優於具有唯一高熵字串的檔案。
壓縮程式碼範例
以下是在 Python、Node.js 和命令列中壓縮和解壓縮 JSONL 檔案的實用範例。每個範例展示如何使用全部三種演算法。
Python 內建 gzip 支援。對於 zstd 和 Brotli,安裝 pyzstd 和 brotli 套件。三者遵循相同的模式:開啟壓縮檔案控制代碼,然後透過它讀取或寫入 JSONL 行。
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 透過 zlib 模組內建支援 gzip 和 Brotli。對於 zstd,使用 @aspect-build/zstd 或 fzstd npm 套件。基於串流的 API 非常適合處理大型 JSONL 檔案而無需完全載入記憶體。
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);}}
命令列工具是壓縮 JSONL 檔案最快的方式。gzip 預裝在所有 Unix 系統上。透過套件管理器安裝 zstd 和 brotli 以使用其他兩種演算法。
# === 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
雲端儲存壓縮策略
在雲端物件儲存中儲存 JSONL 檔案時,壓縮可以減少儲存成本和傳輸時間。大多數雲端供應商透過其 CDN 層支援 gzip 和 Brotli 的透明解壓縮,但上傳和儲存策略有所不同。
使用正確的 Content-Encoding 標頭將壓縮的 JSONL 上傳到 S3。S3 儲存壓縮後的位元組,CloudFront 可以自動解壓縮提供服務。對於資料湖工作負載,AWS Athena 和 Spark 等工具原生讀取 gzip 和 zstd 壓縮的 JSONL。
guide-jsonl-compression.jsonlCompression.cloudStorage.s3.code
Google Cloud Storage 支援 gzip 轉碼。當你使用 Content-Encoding: gzip 標頭上傳 gzip 壓縮的物件時,GCS 可以在客戶端發送 Accept-Encoding: gzip 時自動提供解壓縮版本。對於 BigQuery 匯入,直接使用 gzip 壓縮的 JSONL。
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
最佳實踐:何時使用哪種演算法
沒有單一最佳的壓縮演算法。正確的選擇取決於你優先考慮儲存大小、處理速度、相容性,還是三者的平衡。以下是常見 JSONL 使用場景的明確建議。
歸檔與冷儲存
使用 Brotli(quality 9-11)或 zstd(level 19+)獲得最大壓縮。
歸檔時壓縮時間不太重要。你只壓縮一次,很少解壓縮。Brotli 在 quality 11 時可在 JSONL 資料上實現 10 倍以上的壓縮,顯著降低長期儲存成本。
即時資料管線
使用 zstd(level 1-3)獲得最佳的速度與比率平衡。
在串流管線(Kafka、Kinesis、Flink)中,壓縮和解壓縮速度直接影響吞吐量和延遲。Zstd 在 level 1 時壓縮速度比 gzip 快,同時實現更好的比率。其字典模式非常適合具有固定 schema 的 JSONL。
網路傳輸與 API
靜態檔案使用 Brotli,gzip 作為最大相容性的後備方案。
所有現代瀏覽器都透過 Accept-Encoding: br 支援 Brotli。Cloudflare 和 CloudFront 等 CDN 可以自動使用 Brotli 壓縮。使用 gzip 作為舊版客戶端的後備方案。Zstd 瀏覽器支援正在增長但尚未普及。
ETL 與批次處理
使用 gzip 獲得最大相容性,或 zstd 獲得更好的效能。
大多數資料工具(Spark、Athena、BigQuery、pandas)原生支援 gzip。Zstd 支援正在快速改善。如果你的工具鏈支援 zstd,優先使用它以獲得 3-5 倍更快的壓縮和相當的比率。
試試我們的免費 JSONL 工具
在上傳前壓縮你的 JSONL 檔案,或使用我們的免費線上工具驗證和轉換。無需安裝。