ZIP의 압축률이 파일에 따라 크게 다른 이유는?
「ZIP으로 압축했는데 거의 작아지지 않았다」 또는 「텍스트 파일은 압축 후 크기가 대폭 줄었다」는 경험이 있나요? ZIP 압축률은 파일 종류에 따라 크게 다릅니다. 이 글에서는 그 이유와 각 파일 형식의 특성을 설명합니다.
ZIP에서 사용되는 압축 알고리즘: Deflate
ZIP 포맷(.zip)은 주로 <strong>Deflate</strong> 알고리즘을 사용합니다. Deflate는 다음 두 가지 기술을 결합한 것입니다.
- <strong>LZ77(Lempel-Ziv 1977)</strong>: 데이터 내 반복 패턴을 "이전 출현 위치의 참조"로 대체
- <strong>허프만 부호화</strong>: 출현 빈도가 높은 문자를 짧은 비트열로 표현
즉, <strong>반복 패턴이 많은 데이터일수록 압축률이 높고</strong>, 반대로 랜덤 데이터나 이미 압축된 데이터는 거의 압축할 수 없습니다.
파일 형식별 압축률
| 파일 형식 | 압축률(참고값) | 이유 |
|---|---|---|
| 텍스트(.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 헤더(파일 메타데이터) 때문에 파일 크기가 <strong>약간 증가</strong>할 수 있습니다. ZIP 형식은 각 파일에 대해 로컬 파일 헤더(30바이트 이상)와 전체 ZIP의 중앙 디렉토리를 포함하기 때문입니다.
JPEGファイル (1.00 MB)
└── ZIP圧縮後: 1.00 MB + ヘッダー(約50B)= わずかに増加
「Store」모드와의 구분
ZIP에는 압축하지 않고 파일을 저장하는 <strong>Store</strong> 모드가 있습니다. 이미 압축된 파일(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 파일은 파일 크기를 정확하게 제어하기 위해 <strong>랜덤 데이터(의사 랜덤 바이트 시퀀스)</strong>를 포함합니다. 랜덤 데이터는 최대 엔트로피를 가지므로 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의 압축률은 <strong>데이터의 반복 패턴</strong>의 많음으로 결정됨
- 텍스트·CSV·XML은 <strong>60~85% 감소</strong> 가능
- JPEG, MP4, 기존 압축 파일은 <strong>거의 압축할 수 없음</strong> (오히려 약간 증가할 수 있음)
- 이미 압축된 파일을 결합할 때는 <strong>저장 모드(-0)</strong>로 CPU 절약
- DevLab의 테스트용 ZIP은 랜덤 데이터를 사용하므로 압축 해제 전후로 크기가 거의 동일합니다
→ <a href="/ja/files/zip/">테스트용 ZIP 파일 다운로드는 여기</a>
이 기사에서 사용할 수 있는 테스트 파일
- → <a href="/ja/files/zip/" class="text-primary-600 dark:text-primary-400 hover:underline">ZIP 테스트 파일 목록</a>
- → <a href="/ja/files/csv/" class="text-primary-600 dark:text-primary-400 hover:underline">CSV 테스트 파일 목록</a>
관련 기사
- → <a href="/ja/blog/file-format-quick-reference/" class="text-primary-600 dark:text-primary-400 hover:underline">개발자를 위한 파일 형식 빠른 참조</a>
- → <a href="/ja/blog/file-validation-checklist/" class="text-primary-600 dark:text-primary-400 hover:underline">웹 폼 파일 검증 구현 체크리스트</a>