使用 DEFLATE 压缩文本文件时,需要多少数据才能减小大小?

When compressing text files with DEFLATE how much data is required before a decrease in size is possible?

任何压缩算法实现的压缩程度显然取决于所提供的数据。但是,显然也有一些纯粹由于压缩数据而增加的开销。

我正在处理一个过程,我正在压缩可能是各种类型的数据,但我知道很多数据会非常小,尽管它通常也足够大,可以从某种程度的压缩中获益.虽然我可能只是在应用压缩之前通过实验确定一些最低限度的效果,但我很好奇是否有明确的观点表明这绝对不值得。

运行 一些测试使用 zip,我压缩了一系列文件,分别包含 10、100 和 1000 字节的随机数据和重复的字母表。例如这里是 100 字节字母表文件的内容:

abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqr

我很惊讶地发现文件的压缩版本是 219 字节,尽管有冗余级别。为了比较,带有随机数据的 100 字节文件变成了 272 字节。

然而,1000 字节的字母文件一路压缩到 227 字节,而随机文件增加到 1174。

是否有明确的最小文件大小,即使是最冗余的文件也不会受益于这种类型的压缩?

250 到 500 字节之间是一个不错的阈值,这取决于冗余级别并假设压缩数据所花费的时间可以忽略不计。


我意识到完全冗余的数据(每个字节都相同)可能会导致最大程度的压缩,从而做到了这一点。

Re-running 用从 /dev/zero 读取的数据进行相同的测试,我发现压缩文件的长度并不是真正的变量:

Uncompressed | Compressed | Percent Size
-------------+------------+-------------
100 bytes    | 178 bytes  | 178% 
200 bytes    | 178 bytes  |  89%
300 bytes    | 179 bytes  |  60%
400 bytes    | 180 bytes  |  45%
500 bytes    | 180 bytes  |  36%
  ...
1000 bytes   | 185 bytes  |  19%

这为 技术上 178 字节的答案提供了一个不错的案例(我测试了这个案例并得到了 178 字节)。

但是,我认为字母表测试可能更接近冗余的实际最佳情况(不太了解 DEFLATE 如何寻找冗余)。

使用与问题中相同格式的各种文件,我发现了以下内容:

Uncompressed | Compressed | Percent Size
-------------+------------+-------------
100 bytes    | 212 bytes  | 212% 
200 bytes    | 212 bytes  | 106%
300 bytes    | 214 bytes  |  71%
400 bytes    | 214 bytes  |  54%
500 bytes    | 214 bytes  |  43%
  ...
1000 bytes   | 221 bytes  |  22%

毫不奇怪,212 似乎是此类文件的固定点。

最后,我决定尝试使用更直接的 lorem ipsum 文本方法,最终发现 414 字节是那里的不动点。

基于所有这些,我假设 250 到 500 之间的某个值是跳过一般文本压缩的合理下限,这些文本平均可能有也可能没有一定程度的冗余。如果基准测试显示压缩所花费的时间不值得 space.

中的小好处,那么人们甚至可能想要更高