ZIP의 압축률이 파일에 따라 크게 다른 이유는?
「ZIP으로 압축했는데 거의 작아지지 않았다」 또는 「텍스트 파일은 압축 후 크기가 대폭 줄었다」는 경험이 있나요? ZIP 압축률은 파일 종류에 따라 크게 다릅니다. 이 글에서는 그 이유와 각 파일 형식의 특성을 설명합니다.
ZIP에서 사용되는 압축 알고리즘: Deflate
ZIP 포맷(.zip)은 주로 Deflate 알고리즘을 사용합니다. Deflate는 다음 두 가지 기술을 결합한 것입니다.
- LZ77(Lempel-Ziv 1977): 데이터 내 반복 패턴을 "이전 출현 위치의 참조"로 대체
- 허프만 부호화: 출현 빈도가 높은 문자를 짧은 비트열로 표현
즉, 반복 패턴이 많은 데이터일수록 압축률이 높고, 반대로 랜덤 데이터나 이미 압축된 데이터는 거의 압축할 수 없습니다.
파일 형식별 압축률
| 파일 형식 | 압축률(참고값) | 이유 |
|---|---|---|
| 텍스트(.txt) | 60~80% 감소 | 반복된 문자·단어가 많음 |
| CSV | 70~85% 감소 | 구분 문자・동일한 패턴이 반복 |
| HTML / XML / JSON | 65~85% 감소 | 태그·키 이름의 반복이 많음 |
| 로그 파일 | 70~90% 감소 | 타임스탬프 형식의 반복이 많음 |
| BMP (무압축 이미지) | 50~80% 감소 | 같은 색상의 연속된 픽셀이 많음 |
| 5~20% 감소 | 많은 경우 내부적으로 zlib 압축이 이미 되어 있음 | |
| PNG | 0〜5% 감소 | 이미 Deflate로 압축됨 |
| JPEG | 0〜5% 감소 | 이미 DCT + 허프만으로 압축됨 |
| MP3 / AAC | 0~3% 감소 | 이미 손실 압축됨 |
| MP4 / H.264 | 0~3% 감소 | 이미 고도로 압축됨 |
| ZIP / GZ / 7z | 0~2% 감소(경우에 따라 크기 증가) | 이미 압축된 데이터의 재압축은 거의 효과가 없음 |
압축된 파일이 더 커지는 경우
JPEG나 MP4와 같이 이미 압축된 파일을 ZIP으로 압축하면, ZIP 헤더(파일 메타데이터) 때문에 파일 크기가 약간 증가할 수 있습니다. ZIP 형식은 각 파일에 대해 로컬 파일 헤더(30바이트 이상)와 전체 ZIP의 중앙 디렉토리를 포함하기 때문입니다.
JPEGファイル (1.00 MB)
└── ZIP圧縮後: 1.00 MB + ヘッダー(約50B)= わずかに増加
「Store」모드와의 구분
ZIP에는 압축하지 않고 파일을 저장하는 Store 모드가 있습니다. 이미 압축된 파일(JPEG, MP4 등)을 여러 개 묶을 때 Store 모드를 사용하면 압축 처리의 CPU 부하를 제거하면서 동일한 크기로 저장할 수 있습니다.
# zip コマンドで圧縮レベルを指定
zip -0 archive.zip image.jpg video.mp4 # Store(圧縮なし)
zip -9 archive.zip data.csv report.txt # 最大圧縮
# Python で圧縮レベルを指定
import zipfile
with zipfile.ZipFile('archive.zip', 'w', zipfile.ZIP_DEFLATED, compresslevel=9) as zf:
zf.write('data.csv')
테스트용 ZIP 파일의 특성
DevLab의 테스트용 ZIP 파일은 파일 크기를 정확하게 제어하기 위해 랜덤 데이터(의사 랜덤 바이트 시퀀스)를 포함합니다. 랜덤 데이터는 최대 엔트로피를 가지므로 Deflate 압축이 거의 효과가 없습니다. 따라서 "10MB ZIP 파일" = "압축 해제 후에도 약 10MB"입니다.
"압축 해제 후 특정 크기가 되는 ZIP이 필요"하다면 다음과 같은 방법으로 테스트 파일을 만들 수 있습니다.
# 解凍後ちょうど 100MB になるZIPを作成(ゼロバイト埋め、高圧縮)
dd if=/dev/zero bs=1M count=100 | zip -9 zero-100mb.zip -
# 解凍後ちょうど 100MB になるZIPを作成(ランダムデータ、ほぼ無圧縮)
dd if=/dev/urandom bs=1M count=100 | zip -0 random-100mb.zip -
요약
- ZIP의 압축률은 데이터의 반복 패턴의 많음으로 결정됨
- 텍스트·CSV·XML은 60~85% 감소 가능
- JPEG, MP4, 기존 압축 파일은 거의 압축할 수 없음 (오히려 약간 증가할 수 있음)
- 이미 압축된 파일을 결합할 때는 저장 모드(-0)로 CPU 절약
- DevLab의 테스트용 ZIP은 랜덤 데이터를 사용하므로 압축 해제 전후로 크기가 거의 동일합니다