如何估算是否需要zip64扩展而不依赖异常?
我有一些客户的要求,关于如何压缩多个文件。
如果创建的压缩文件小于2的31次方减1,大约是2GB,就要使用压缩方式来创建它(用zipfile.ZIP_DEFLATED),否则就不压缩(用zipfile.ZIP_STORED)。
现在的解决方案是先压缩文件,但不使用zip64,然后捕捉zipfile.LargeZipFile这个异常,再创建一个不压缩的版本。
我想问的是,是否值得尝试大致计算一下这个压缩文件是否会超过zip64的大小,而不需要实际处理所有文件?因为压缩这么大量的数据很慢,减少重复的压缩处理可能会让速度快一点。
补充:我会给这两种解决方案点赞,因为我觉得可以通过最大和最小文件大小以及压缩比的组合来生成一个有用的经验法则。不幸的是,目前StackOverflow不让我点赞(直到我的声望高于新手)。感谢大家的好建议。
3 个回答
我知道的估算压缩文件大小的方法,就是查看之前压缩过的类似文件的压缩比。
我只想到两种方法,一种简单但需要手动调整,另一种可能复杂得不值得。
设定一个文件大小,当文件超过这个大小时就直接跳过压缩,不去尝试。这个大小可以根据你的需要手动调整。
记录最近N个文件的大小,从最小的压缩失败到最大的成功压缩。然后决定一个可以接受的错误选择概率,比如说5%。设置一个“别费劲去压缩”的阈值,这样就能确保大约5%的本该被压缩的文件不会被漏掉。
如果你绝对不能错过任何一个应该被压缩的文件,那你其实已经有了解决方案。
一种启发式的方法总是会有一些错误的正面结果和错误的负面结果。
压缩后文件的大小会受到很多因素的影响,有些因素在实际进行压缩之前是无法知道的。
Zip64可以使用多种不同的压缩格式,比如bzip2、LZMA等。甚至同一种压缩格式在处理不同的数据时,压缩的方式也可能不同。例如,bzip2可以使用Burrows-Wheeler算法、游程编码和霍夫曼编码等。最终文件的大小会依赖于被压缩数据的统计特性。
以霍夫曼编码为例,符号表的大小取决于文件内容的随机分布程度。
你可以尝试分析不同类型的数据,比如序列化的二进制数据、文本、图片等等,每种数据的最终压缩大小的分布都是不同的。
如果你真的想节省时间,只进行一次压缩,除了建立一个非常大的数据库并使用基于规则的专家系统或基于贝叶斯定理的系统外,没有真正的100%解决方案。
你也可以尝试在文件中随机抽取一些块进行压缩,然后根据文件的大小进行线性插值。