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의 주요 차이점을 요약합니다. 이는 기본 설정에서의 일반적 특성이며, 실제 성능은 데이터와 압축 레벨에 따라 다릅니다.
| 지표 | gzip | zstd | Brotli |
|---|---|---|---|
| 압축률 | 양호 (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 MB | 7.0배 | 2.8초 | 0.9초 |
| gzip (레벨 9) | 13.1 MB | 7.6배 | 8.4초 | 0.9초 |
| zstd (레벨 3) | 12.8 MB | 7.8배 | 0.6초 | 0.3초 |
| zstd (레벨 1) | 15.1 MB | 6.6배 | 0.3초 | 0.3초 |
| Brotli (레벨 6) | 11.5 MB | 8.7배 | 3.2초 | 0.5초 |
| Brotli (레벨 11) | 9.8 MB | 10.2배 | 42.1초 | 0.4초 |
벤치마크는 일반적인 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으로 압축된 객체를 업로드하면, 클라이언트가 Accept-Encoding: gzip을 보낼 때 GCS가 자동으로 해제된 버전을 제공할 수 있습니다. 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 (품질 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 파일을 압축하거나, 무료 온라인 도구로 검증 및 변환하세요. 설치가 필요 없습니다.