JSONL 압축: gzip vs zstd vs Brotli

JSONL 파일 압축을 위한 실용 가이드입니다. 압축률, 속도 벤치마크를 비교하고 데이터 파이프라인, 클라우드 스토리지, 웹 전달에 gzip, zstd, Brotli 중 언제 어떤 것을 사용해야 하는지 알아보세요.

최종 업데이트: 2026년 2월

왜 JSONL 파일을 압축하는가?

JSONL 파일은 빠르게 커집니다. 하루치 애플리케이션 로그가 기가바이트의 줄 구분 JSON을 생성할 수 있으며, 머신러닝 데이터셋은 일상적으로 수십 기가바이트에 달합니다. 압축 없이는 스토리지 비용이 더 들고, 전송에 더 오래 걸리며, 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보다 눈에 띄게 느립니다.

직접 비교

다음 표는 JSONL 파일을 압축할 때 가장 중요한 지표에서 gzip, zstd, Brotli의 주요 차이점을 요약합니다. 이는 기본 설정에서의 일반적 특성이며, 실제 성능은 데이터와 압축 레벨에 따라 다릅니다.

지표gzipzstdBrotli
압축률양호 (5-8배)매우 양호 (6-10배)우수 (7-12배)
압축 속도보통빠름느림~보통
해제 속도보통매우 빠름빠름
CPU 사용량보통낮음~보통높음 (최대 레벨)
브라우저 지원모든 브라우저Chrome 123+, Firefox 126+모든 최신 브라우저
스트리밍 지원예 (네이티브)예 (네이티브)제한적

벤치마크 결과: 100 MB JSONL 파일

구체적인 수치를 제공하기 위해, 애플리케이션 로그 레코드가 포함된 100 MB JSONL 파일 압축 벤치마크 결과를 제시합니다. 각 레코드에는 타임스탬프, 로그 레벨, 메시지 문자열, 중첩된 메타데이터 객체를 포함한 12개의 필드가 있습니다. 테스트는 32 GB RAM과 NVMe 스토리지를 갖춘 AMD Ryzen 7에서 실행되었습니다.

알고리즘 & 레벨압축 크기비율압축 시간해제 시간
gzip (레벨 6)14.2 MB7.0배2.8초0.9초
gzip (레벨 9)13.1 MB7.6배8.4초0.9초
zstd (레벨 3)12.8 MB7.8배0.6초0.3초
zstd (레벨 1)15.1 MB6.6배0.3초0.3초
Brotli (레벨 6)11.5 MB8.7배3.2초0.5초
Brotli (레벨 11)9.8 MB10.2배42.1초0.4초

벤치마크는 일반적인 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으로 압축된 객체를 업로드하면, 클라이언트가 Accept-Encoding: gzip을 보낼 때 GCS가 자동으로 해제된 버전을 제공할 수 있습니다. 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 (품질 9-11) 또는 zstd (레벨 19+)를 사용하세요.

보관에서는 압축 시간이 덜 중요합니다. 한 번 압축하고 드물게 해제합니다. 품질 11의 Brotli는 JSONL 데이터에서 10배 이상의 압축을 달성하여 장기 스토리지 비용을 크게 줄일 수 있습니다.

실시간 데이터 파이프라인

최고의 속도 대비 압축률 트레이드오프를 위해 zstd (레벨 1-3)를 사용하세요.

스트리밍 파이프라인(Kafka, Kinesis, Flink)에서는 압축 및 해제 속도가 처리량과 지연 시간에 직접 영향을 미칩니다. 레벨 1의 zstd는 더 나은 비율을 달성하면서 gzip보다 빠르게 압축합니다. 딕셔너리 모드는 고정 스키마를 가진 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