我有一个文本文件,大小为 19 字节,使用 zip 和 7zip 压缩文件后,文件大小似乎更大。我读过这个问题为什么 7zipped 文件比原始文件大?也为什么 ZIP 压缩不能压缩任何东西?但考虑到文件尚未压缩,我预计会进一步压缩。附件是屏幕截图。
編輯0
我进一步举例,创建一个包含随机数据的文件,如下所示dd if=/dev/urandom of=sample.log bs=1G count=1
,并尝试使用 zip 和 7zip 压缩该文件,但没有压缩效果。这是为什么呢?
答案1
正如@kinokijuf所说,有一个文件头。但要进一步了解,还需要了解有关文件压缩的其他一些事项。
zip 头包含识别文件类型(魔术数字)、zip 版本以及最终存档中包含的所有文件的列表所需的所有信息。
您的文件可能无论如何都没有被压缩。如果您运行,unzip -l example.zip
您可能会看到文件大小没有变化。19 个字节可能会产生比通过 DEFLATE(zip 使用的主要压缩方法)压缩时节省的更多开销。
在其他情况下,例如 PNG 图像,它们已经压缩,因此 zip 将直接存储它们。DEFLATE 不会费心压缩任何已压缩的内容。
另一方面,如果你有很多文本文件,并且每个文件的大小都超过几千字节,那么将它们全部放入一个单身的zip 档案。
压缩非常常规的格式化数据(例如包含 SQL 转储的文本文件)时,您将获得最大的节省。例如,我曾经转储了一个大约 13MB 的小型 SQL 数据库。我运行zip -9 dump.sql dump.zip
它后,最终只剩下大约 1MB。
另一个因素是您的压缩级别。许多归档器默认只在中等级别进行压缩,追求速度而非压缩。使用 zip 进行压缩时,请尝试-9
使用最大压缩标志(我认为 3.x 手册说压缩级别目前仅由 DEFLATE 支持)。
总结
存档的开销超过了压缩文件可能获得的任何收益。尝试将更大的文本文件放入其中,看看会有什么结果。-v
压缩时使用标记,可以查看节省的费用。
答案2
压缩可以删除数据高度结构化时出现的冗余信息。
由此可以看出,已经压缩的文件无法进一步压缩,因为冗余已经消失,而且随机数据也无法很好地压缩,因为它从来没有任何结构或冗余。
有一门完整的科学,即信息论,它涉及测量信息密度(和互信息),并使用冗余和结构来执行压缩、加密攻击以及错误检测和恢复。