技术
为什么有些文件压不动:压缩的极限在哪里
📅 2026-10-01 · ✍️ 闪压技术团队 · ⏱ 4 分钟阅读
压缩不是"变小",是"删掉冗余"
很多人第一次用压缩工具都会失望:文件塞进去,出来几乎一样大。这不是工具偷懒,而是压缩这件事本身的边界。
压缩的整个逻辑建立在一个前提上——数据里存在冗余。文档里反复出现的词、表格里大片相同的单元格,这些内容在原始文件里被一次次重复写下来。压缩算法要做的是用一次引用代替所有的重复,本质上是替文件做缩写:头一次出现的部分照写,后面再见到只留一个指向它的短标记。
所以压缩的第一道门槛不是算法强不强,而是文件里到底有没有可预测的部分。
判断起来并不复杂:如果数据本身已呈现出"看不出规律"的状态,压缩就无从下手。
随机数据:压缩的绝缘体
一个极端例子是随机数据。随机意味着每一位都和前一位没有关系,任何一位都无法从上下文推测。既然无法预测,就没有"只写一次、后面引用"的空间,冗余为零。
用熵的语言说,这类数据里每种符号出现的概率都差不多,没有高频符号可以被短码表示,也没有重复序列能被字典匹配命中。压缩的两种主要手段——字典编码和熵编码——会同时失去着力点。
这类文件在实践中并不罕见:加密后的密文在密码学意义上就是刻意构造的随机,擦除后残留的磁盘区块,某些设备采集的噪声数据。把它们交给压缩算法,结果几乎必然是包了一层外壳却没省下空间,甚至更大。
压过的文件是最难压的一类
这条规律可以直接从上面推出来。文件经过压缩后,冗余已被上一轮算法摘干净:重复的改成了引用,高频的换成了短码。留下来的部分,正是压缩算法眼中的不可约内容。
有意思的是,工具本身也知道这件事。闪压在执行前会读取原文件状态,对体积本就偏小的输入,或者明显已经过压缩处理的格式,往往直接给出体积几乎不变甚至变大的提示——这正是压缩后比原文件还大的常见原因在算法层面的解释。
这也让"再压一遍"成了坏习惯:首轮拿走的是结构冗余,后续面对的接近随机数据,只剩时间成本。
熵是天花板,不是算法
信息论给出的判断要冷得多:熵为数据设下了一个下限,任何无损算法都跨不过去。算法能做的只是贴近这个下限,而不是抹平它。
当不同算法表现接近时,通常意味着文件已经抵达熵极限,此时再换算法收益也有限。字典编码与熵编码的配合方式之所以有效,正是因为它同时从两个方向压缩不确定性;而对熵本身已经很高的数据,这两条路会一起被堵死。
真正能改变结果的,往往不是换一个更强的算法,而是在压缩之前先改变数据的形态。
预处理:把看不见的冗余挖出来
这里有个反直觉的思路:如果文件本身不可压,能不能先让它变得可压?压缩前的预处理如何提升整体熵值讲的正是这个环节。
把不同类型的数据分开存放,让单一算法不必同时应付矛盾内容;把大段重复的结构先抽成模板。这些操作不改信息本身,只是让冗余从隐藏变成可见,后面的算法才有东西可用。
文件压缩算法如何按类型选择讨论的是同一件事:不同内容的最优路径不同,混在一起会让每种算法都发挥不出水平。
回到那个让人失望的瞬间
下次遇到"压完没变化",不必怀疑工具。先自己判断:如果文件是文档、源码、含大段重复内容的表格,压不动才反常;如果它是加密包、已压缩素材,或混杂了图片与二进制块的整包,那么接近原始大小才是符合原理的结果。
更多算法原理,可以看熵编码的哈夫曼与算术实现那篇。