【问题标题】:When compressing text files with DEFLATE how much data is required before a decrease in size is possible?使用 DEFLATE 压缩文本文件时,需要多少数据才能减小大小?
【发布时间】:2019-10-16 13:21:35
【问题描述】:

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

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

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

abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqr

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

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

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

【问题讨论】:

  • 如果我对您的示例执行 zip -9 abc.zip abc.txt,Deflate 会将其减少到 33 个字节(您可以通过 unzip -v abc.zip 看到它)。其余的是与文件 abc.txt 相关的元数据(其名称、时间戳……)。

标签: compression deflate


【解决方案1】:

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


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

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

未压缩 |压缩 |百分比大小 -------------+------------+------------- 100 字节 | 178 字节 | 178% 200 字节 | 178 字节 | 89% 300 字节 | 179 字节 | 60% 400 字节 | 180 字节 | 45% 500 字节 | 180 字节 | 36% ... 1000 字节 | 185 字节 | 19%

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

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

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

未压缩 |压缩 |百分比大小 -------------+------------+------------- 100 字节 | 212 字节 | 212% 200 字节 | 212 字节 | 106% 300 字节 | 214 字节 | 71% 400 字节 | 214 字节 | 54% 500 字节 | 214 字节 | 43% ... 1000 字节 | 221 字节 | 22%

不出所料,212 似乎是此类文件的固定点。

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

基于所有这些,我认为 250 到 500 之间的值将是跳过一般文本压缩的合理下限,这些文本可能平均具有或不具有某种程度的冗余。如果基准测试表明压缩所花费的时间不值得在空间中获得微小的好处,人们甚至可能想要更高。

【讨论】:

    猜你喜欢
    • 2021-08-10
    • 2020-04-23
    • 1970-01-01
    • 2013-09-11
    • 2017-04-24
    • 1970-01-01
    • 2021-03-30
    • 2018-11-19
    • 1970-01-01
    相关资源
    最近更新 更多