如何估算压缩文件的“开销”?

6
假设我们压缩一个大小为7字节的.txt 文件。在压缩并转换为.zip文件后,其大小将为190字节。
有没有一种方法来估计或计算“开销”的近似大小?
什么因素影响开销大小? Zlib计算开销:他们说:“......仅扩展是每个16 KB块的5个字节的开销(约0.03%),以及整个流的一次性6个字节的开销。”
我只是想说这个网站可以估计“开销”的大小。 注意开销是添加到数据的压缩版本中的额外数据量。
1个回答

4

ZIP格式开始...

假设只有一个中央目录和没有注释和没有额外的字段,开销应该类似于以下内容。(如果添加了任何其他元数据,则开销将增加。)

  • 每个文件(本地文件头)- 30+len(filename)
  • 每个文件(数据描述符)- 12(到16)
  • 每个文件(中央目录头)- 46+len(filename)
  • 每个存档(EOCD)- 22

因此,开销为afn是所有文件名的平均长度,f是文件数:

  f * ((30 + afn) + 12 + (46 * afn)) + 22
= f * (88 + 2 * afn) + 22

当需要非常小的压缩数据且不需要文件结构或元数据时,ZIP显然是一个非常糟糕的选择,相反,zlib是一个非常薄的Deflate包装器。对于小负载,糟糕的Deflate实现也可能导致明显更大的“压缩”大小,比如臭名昭著的.NET实现...

示例:

  • 存储1个名为“hello world note.txt”(长度为20)的文件,

    = 1 *(88 + 2* 20)+ 22 = 150 字节的开销

  • 存储100个文件,平均名称长度为14个字母,

    = 100 *(88 + 2 * 14)+ 22 = 11622 字节的开销


非常感谢。您能否更详细地解释每个项目符号的含义?例如,我不知道我们如何获取(EOCD)大小。以及您是如何计算“afn”的?再次感谢。 - user3184352
afn = (len(filename1)+len(filename2)+len(filename3)+..)/number_of_files。根据其他假设(例如没有追加,因此没有重复的CD条目),只有一个22字节的EOCD。 - user2864740
你的意思是所有文件的EOCD都是22吗?“数据描述符”和“本地文件头”分别始终为16和30吗? - user3184352
数据描述符是固定大小的,EOCD(不包括注释)也是固定大小的,但如果ZIP文件被“附加”,则EOCD(中央目录条目)可以重复。本地文件头和中央目录头的大小都取决于文件名的长度(因此即使使用额外的注释/字段功能,它们也是可变大小的)。 - user2864740
再次感谢您。如果我问了很多问题,对不起。什么是“注释/字段特性”?有没有一篇好的文章详细解释开销。 - user3184352
@user3184352 可以使用适当的ZIP工具设置额外的元数据,可以是几乎任何数据(并且可以达到65k /条目的任意长度)。WinZIP在评论方面的说明可参考此链接:"评论是嵌入Zip文件中的可选文本信息。可以使用评论窗口查看、创建、编辑或删除评论。" - user2864740

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接