技术
字节分布怎么决定压缩率:为什么有些文件天生压不动
📅 2026-10-22 · ✍️ 闪压团队 · ⏱ 4 分钟阅读
压缩包里存的文件不会原样摆放,它们要先变成一串更短的比特。这一步靠的是重复:同样的模式出现第二次以后,就不必再完整写一遍。理解压缩的原理,先要理解字节是怎么分布的。
压缩靠的是重复
无损压缩的基本逻辑只有一句话:把重复出现的东西换成更短的记号。
一段数据里某个字节模式反复出现,压缩器就用一个短编号代表它,解码的时候再还原。模式越长越常见,省下来的空间越多。
所以压缩率不取决于文件有多大,而取决于文件里有多少重复。这就是为什么几兆的日志文件能压到很小,而同样大小的图片几乎压不动。体积和可压缩性是两件事,这一点是后面所有判断的基础。
字节分布决定重复程度
同一个文件夹里,不同类型的文件压出来体积差别很大,原因就在字节分布上。
结构规整的数据重复度高。表格数据里有大量相同的分隔符和固定长度的字段,配置文件的行结构高度雷同,日志文件的每一行都是同样的模板。这些内容的字节取值集中在少数几种上,重复模式非常明显,压缩器一上手就能找到大量可以替换的地方。
原始照片、视频、已经加密过的文件,字节分布接近均匀随机。随机的数据里找不到长模式,压缩器找不到可以替换的重复,自然就压不动。
更极端的例子是压缩包套压缩包。内层已经用短编号替换掉了重复,外层看到的是一堆互不相同的编号,重复度比原始文件还低。所以对着压缩包再压一次,通常只会白费功夫。
为什么有的文件天生压不动
已经压缩过的文件就是压不动,原因刚才说过了。但这里有个容易误解的点:压不动不代表文件有问题,也不代表压缩器出了故障。
信息本身已经没有可压缩的冗余了,再压只会更大。这也是有些文件压不动的原理讲的事情。
所以在动手压之前先判断一下值不值得,是省时间的关键。已经压过的图片、加密文件、媒体文件,直接跳过,别指望再挤出一半的空间。
重复也有层级
重复不是只有一种。
同一位置附近的重复,叫近距离匹配,这是滑动窗口算法处理的对象。相隔很远的两段内容完全一样,也能匹配,只要还在窗口范围内。再往上,整个文件里反复出现的固定短语,属于词典编码处理的对象,词典里存的就是这些常用短语,编码时用编号代替。
不同层级各有各的适用范围,详细拆解可以看字典编码与熵编码怎么分工。有损和无损的边界在哪里,见无损压缩与有损压缩的区别。
最终补一点实操:判断一个目录值不值得压,看它的字节分布比看它的体积更准。结构规整的目录压缩收益明显,已经处理过一轮的目录压缩收益接近于零。
最终补一个容易被忽略的点:字节分布不只看文件类型,还看同一份文件里不同区域的情况。
一个文档可能前半部分是规整的表格数据,后半部分是一大段抓取下来的乱码日志。这种混合文件整体压不动,但如果先把后半部分单独处理掉,前半部分能压出很可观的体积。
所以遇到压不动的文件,不要直接放弃,先看看它是不是混合型的。找出结构规整的那部分单独处理,往往比整份硬压要划算。
实操中怎么快速判断
不用打开文件逐个试,有几个省事的办法。
看文件类型。文本、代码、配置文件、日志这类,字节分布天然规整,压缩收益明显。图片、音频、视频、已经加密过的包,压不动是正常的,直接跳过。
看体积变化。如果压完之后体积几乎没变,说明这个文件里没有可利用的重复,再压一次也是同样结果,不用在同一个文件上耗时间。
看来源。已经压缩过的资源,比如从网上下载的安装包、素材包,再压一遍基本是白做,反而占时间。
这三条判断加在一起,基本能覆盖大部分目录。真正值得花时间的是那些体积不大、但明显是结构化内容的目录。