使用 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.
中的小好处,那么人们甚至可能想要更高
任何压缩算法实现的压缩程度显然取决于所提供的数据。但是,显然也有一些纯粹由于压缩数据而增加的开销。
我正在处理一个过程,我正在压缩可能是各种类型的数据,但我知道很多数据会非常小,尽管它通常也足够大,可以从某种程度的压缩中获益.虽然我可能只是在应用压缩之前通过实验确定一些最低限度的效果,但我很好奇是否有明确的观点表明这绝对不值得。
运行 一些测试使用 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.
中的小好处,那么人们甚至可能想要更高