为什么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% 的减少(某些情况下可能增加) | 对已压缩数据进行重新压缩基本上无效 |
压缩文件变得更大的情况
使用 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>