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 檔案時最重要的指標上的關鍵差異。這些是預設設定下的一般特性;實際效能因資料和壓縮等級而異。

指標gzipzstdBrotli
壓縮比率良好 (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 MB7.0x2.8s0.9s
gzip(等級 9)13.1 MB7.6x8.4s0.9s
zstd(等級 3)12.8 MB7.8x0.6s0.3s
zstd(等級 1)15.1 MB6.6x0.3s0.3s
Brotli(等級 6)11.5 MB8.7x3.2s0.5s
Brotli(等級 11)9.8 MB10.2x42.1s0.4s

基準測試代表典型的 JSONL 日誌資料。結果因欄位基數、值熵和記錄結構而異。具有高重複鍵和低熵值(如日誌等級或狀態碼)的檔案壓縮效果優於具有唯一高熵字串的檔案。

壓縮程式碼範例

以下是在 Python、Node.js 和命令列中壓縮和解壓縮 JSONL 檔案的實用範例。每個範例展示如何使用全部三種演算法。

Python 內建 gzip 支援。對於 zstd 和 Brotli,安裝 pyzstd 和 brotli 套件。三者遵循相同的模式:開啟壓縮檔案控制代碼,然後透過它讀取或寫入 JSONL 行。

Python:gzip、zstd 與 Brotli
import gzip
import json
# === gzip (built-in) ===
# Write compressed 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')
# Read compressed 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
# Write compressed 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')
# Read compressed 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
# Compress an entire JSONL file
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)
# Decompress
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 透過 zlib 模組內建支援 gzip 和 Brotli。對於 zstd,使用 @aspect-build/zstd 或 fzstd npm 套件。基於串流的 API 非常適合處理大型 JSONL 檔案而無需完全載入記憶體。

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 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、zstd 與 Brotli
# === gzip ===
# Compress (keeps original by default with -k)
gzip -k data.jsonl # -> data.jsonl.gz
gzip -9 -k data.jsonl # max compression
# Decompress
gzip -d data.jsonl.gz
# or: gunzip data.jsonl.gz
# === zstd ===
# Install: brew install zstd / apt install zstd
zstd data.jsonl # -> data.jsonl.zst
zstd -3 data.jsonl # level 3 (default)
zstd --fast data.jsonl # fastest compression
# Decompress
zstd -d data.jsonl.zst
# or: unzstd data.jsonl.zst
# === Brotli ===
# Install: brew install brotli / apt install brotli
brotli data.jsonl # -> data.jsonl.br
brotli -q 6 data.jsonl # quality 6
brotli -q 11 data.jsonl # max compression
# Decompress
brotli -d data.jsonl.br
# === Piping with jq ===
# Compress filtered JSONL
cat data.jsonl | jq -c 'select(.level == "error")' | gzip > errors.jsonl.gz
# Decompress and count lines
zstd -dc data.jsonl.zst | wc -l

雲端儲存壓縮策略

在雲端物件儲存中儲存 JSONL 檔案時,壓縮可以減少儲存成本和傳輸時間。大多數雲端供應商透過其 CDN 層支援 gzip 和 Brotli 的透明解壓縮,但上傳和儲存策略有所不同。

使用正確的 Content-Encoding 標頭將壓縮的 JSONL 上傳到 S3。S3 儲存壓縮後的位元組,CloudFront 可以自動解壓縮提供服務。對於資料湖工作負載,AWS Athena 和 Spark 等工具原生讀取 gzip 和 zstd 壓縮的 JSONL。

AWS S3 壓縮
guide-jsonl-compression.jsonlCompression.cloudStorage.s3.code

Google Cloud Storage 支援 gzip 轉碼。當你使用 Content-Encoding: gzip 標頭上傳 gzip 壓縮的物件時,GCS 可以在客戶端發送 Accept-Encoding: gzip 時自動提供解壓縮版本。對於 BigQuery 匯入,直接使用 gzip 壓縮的 JSONL。

Google Cloud Storage 壓縮
from google.cloud import storage
import gzip
import json
client = storage.Client()
bucket = client.bucket('my-data-bucket')
# Upload gzip-compressed 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: 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 檔案,或使用我們的免費線上工具驗證和轉換。無需安裝。

線上處理 JSONL 檔案

在瀏覽器中即時檢視、驗證和轉換高達 1GB 的 JSONL 檔案。無需上傳,100% 隱私保護。

常見問題

JSONL 壓縮 — gzip vs zstd vs brotli(基準測試)| jsonl.co