通过鸽子原理,每个无损压缩算法都可以“失败”,即对于某些输入,它产生的输出比输入长。是否有可能明确地构建一个文件,当该文件被送到例如gzip或其他无损压缩程序,会导致(更多)更大的输出? (或者,更好的是,文件在随后的压缩中无限制地膨胀?)
答案 0 :(得分:8)
嗯,我最终会假设它会最大化,因为位模式会重复,但我只是这样做了:
touch file
gzip file -c > file.1
...
gzip file.9 -c > file.10
得到了:
0 bytes: file
25 bytes: file.1
45 bytes: file.2
73 bytes: file.3
103 bytes: file.4
122 bytes: file.5
152 bytes: file.6
175 bytes: file.7
205 bytes: file.8
232 bytes: file.9
262 bytes: file.10
这里有24,380个图形文件(实际上真的对我来说很惊讶):
alt text http://research.engineering.wustl.edu/~schultzm/images/filesize.png
我没想到会出现这种增长,我只希望线性增长,因为它应该只是将现有数据封装在带有模式字典的标题中。我打算运行1,000,000个文件,但在此之前我的系统用完了磁盘空间。
如果要重现,请使用bash脚本生成文件:
#!/bin/bash
touch file.0
for ((i=0; i < 20000; i++)); do
gzip file.$i -c > file.$(($i+1))
done
wc -c file.* | awk '{print $2 "\t" $1}' | sed 's/file.//' | sort -n > filesizes.txt
生成的filesizes.txt是您喜欢的图形工具的制表符分隔文件。 (您必须手动删除“总计”字段,或将其编写脚本。)
答案 1 :(得分:3)
随机数据或使用优质cypher加密的数据可能是最好的。
但是,一旦确定它无法压缩数据,任何好的打包程序都应该只添加常量开销。 (@坦率)。对于固定开销,空文件或单个字符将提供最大的百分比开销。
对于包含文件名(例如rar,zip,tar)的打包者,您当然可以使文件名真正长: - )
答案 2 :(得分:0)
尝试gzip由以下命令产生的文件:
echo a > file.txt
压缩2字节文件导致31字节的gzip压缩文件!
答案 3 :(得分:0)
其中包含1个字节的文本文件(例如一个字符,如“A”)存储在磁盘上的1个字节中,但winrar将其格式化为94个字节并将其压缩为141个字节。
我知道这是一种作弊的答案,但它确实有效。我认为这将是您将要看到的原始尺寸和“压缩”尺寸之间最大的%差异。
看一下压缩的公式,它们相当简单,并且要使“压缩”文件大于原始文件,最基本的方法是避免任何重复数据。
答案 4 :(得分:0)
所有这些压缩算法都在寻找冗余数据。如果您的文件中没有冗余或非常少的冗余(例如abac…az
,bcbd…bz
,cdce…cz
等序列,那么“缩小”的输出很可能是充气。