콘텐츠로 건너뛰기

ZIP의 압축률이 파일에 따라 크게 다른 이유는?

카테고리: 파일 형식

「ZIP으로 압축했는데 거의 작아지지 않았다」 또는 「텍스트 파일은 압축 후 크기가 대폭 줄었다」는 경험이 있나요? ZIP 압축률은 파일 종류에 따라 크게 다릅니다. 이 글에서는 그 이유와 각 파일 형식의 특성을 설명합니다.

파일 유형별 압축 후 크기 (원본 100% 대비) 0% 100% TXT / CSV ~15% JSON / XML ~20% HTML / CSS / JS ~25% DOCX / XLSX ~90% PDF ~95% JPEG / PNG / MP3 ~99% MP4 / ZIP ~100%
그림: 파일 유형별 ZIP 압축률 비교 (작을수록 효과적)

ZIP에서 사용되는 압축 알고리즘: Deflate

ZIP 포맷(.zip)은 주로 Deflate 알고리즘을 사용합니다. Deflate는 다음 두 가지 기술을 결합한 것입니다.

  • LZ77(Lempel-Ziv 1977): 데이터 내 반복 패턴을 "이전 출현 위치의 참조"로 대체
  • 허프만 부호화: 출현 빈도가 높은 문자를 짧은 비트열로 표현

즉, 반복 패턴이 많은 데이터일수록 압축률이 높고, 반대로 랜덤 데이터나 이미 압축된 데이터는 거의 압축할 수 없습니다.

파일 형식별 압축률

파일 형식압축률(참고값)이유
텍스트(.txt)60~80% 감소반복된 문자·단어가 많음
CSV70~85% 감소구분 문자・동일한 패턴이 반복
HTML / XML / JSON65~85% 감소태그·키 이름의 반복이 많음
로그 파일70~90% 감소타임스탬프 형식의 반복이 많음
BMP (무압축 이미지)50~80% 감소같은 색상의 연속된 픽셀이 많음
PDF5~20% 감소많은 경우 내부적으로 zlib 압축이 이미 되어 있음
PNG0〜5% 감소이미 Deflate로 압축됨
JPEG0〜5% 감소이미 DCT + 허프만으로 압축됨
MP3 / AAC0~3% 감소이미 손실 압축됨
MP4 / H.2640~3% 감소이미 고도로 압축됨
ZIP / GZ / 7z0~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은 랜덤 데이터를 사용하므로 압축 해제 전후로 크기가 거의 동일합니다

테스트용 ZIP 파일 다운로드는 여기

이 기사에서 사용할 수 있는 테스트 파일

❓ 자주 묻는 질문

ZIP으로 압축해도 파일 크기가 거의 변하지 않는 이유는?
JPEG, PNG, MP3, MP4 등은 이미 압축된 형식이므로 ZIP의 Deflate 알고리즘으로는 거의 압축되지 않습니다. 압축된 파일을 ZIP으로 만들면 ZIP 헤더만큼 크기가 약간 늘어나는 경우도 있습니다. 텍스트, CSV, HTML, XML처럼 반복 패턴이 많은 데이터는 60~85% 정도 크기를 줄일 수 있습니다.
ZIP의 Store 모드란 무엇이며 언제 써야 하나요?
Store 모드는 압축하지 않고 파일을 그대로 ZIP 아카이브에 담는 방식입니다. JPEG, MP4처럼 이미 압축된 파일을 여러 개 묶을 때 적합합니다. 압축 처리의 CPU 부하를 없애면서 동등한 크기로 담을 수 있습니다. zip 명령에서는 -0 옵션으로 지정합니다.
ZIP에서 압축률이 가장 높은 파일 형식은?
로그 파일이 가장 압축률이 높아 70~90% 감소가 가능합니다. 이어서 CSV(70~85% 감소), HTML·XML·JSON(65~85% 감소), 텍스트 파일(60~80% 감소) 순입니다. 이들은 반복 패턴이 많아 Deflate 알고리즘의 LZ77 참조 치환과 허프만 부호화가 효과적으로 작동합니다.