跳到内容

为什么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)主要使用<strong>Deflate</strong>算法。Deflate是以下两种技术的组合。

  • <strong>LZ77(Lempel-Ziv 1977)</strong>:将数据中的重复模式替换为"对先前出现位置的引用"
  • <strong>哈夫曼编码</strong>:用更短的比特序列表示出现频率较高的字符

<strong>重复模式越多的数据压缩率越高</strong>,反之随机数据或已经压缩的数据几乎无法压缩。

按文件格式的压缩率

文件格式压缩率(参考值)原因
文本 (.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 头部(文件元数据),文件大小可能会<strong>略微增加</strong>。这是因为 ZIP 格式为每个文件包含本地文件头(30 字节或更多)和整个档案的中央目录。

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>Store 模式(-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">Web 表单文件验证实现检查清单</a>