跳到内容

为什么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 / JSON降低 65–85%标签和键名重复较多
日志文件70~90%削减时间戳格式重复较多
BMP(未压缩图像)降低 50–80%相同颜色的连续像素较多
PDF降低 5–20%在许多情况下,内部已使用zlib压缩
PNG0~5% 削减已使用 Deflate 压缩
JPEG0~5% 削减已使用 DCT + 哈夫曼编码压缩
MP3 / AAC0~3% 的减少已进行有损压缩
MP4 / H.2640~3% 的减少已高度压缩
ZIP / GZ / 7z0~2% 的减少(某些情况下可能增加)对已压缩数据进行重新压缩基本上无效

压缩文件变得更大的情况

使用 ZIP 压缩已压缩的文件(如 JPEG 或 MP4)时,由于 ZIP 头部(文件元数据),文件大小可能会略微增加。这是因为 ZIP 格式为每个文件包含本地文件头(30 字节或更多)和整个档案的中央目录。

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 和预压缩文件几乎无法压缩(可能甚至略微增加)
  • 合并已压缩文件时,使用 Store 模式(-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 回溯引用与哈夫曼编码。