1

对于压缩多个文件,我有以下要求(来自客户端)。

如果创建的 zip 文件小于 2**31-1 ~2GB,则使用压缩创建它(使用 zipfile.ZIP_DEFLATED),否则不要压缩它(使用 zipfile.ZIP_STORED)。

当前的解决方案是在没有 zip64 的情况下压缩文件并捕获 zipfile.LargeZipFile 异常,然后创建非压缩版本。

我的问题是是否值得尝试(大约)计算 zip 文件是否会超过 zip64 大小而不实际处理所有文件,以及如何最好地进行?压缩如此大量数据的过程很慢,最小化重复压缩处理可能会加快一点速度。

编辑:我会赞成这两种解决方案,因为我认为我可以从最大和最小文件大小和压缩比的组合中生成有用的启发式方法。不幸的是,此时 StackOverflow 阻止我投票(直到我的声誉高于 noob)。谢谢你的好建议。

4

3 回答 3

0

我知道估计 zip 文件大小的唯一方法是查看以前压缩的类似性质的文件的压缩率。

于 2012-01-28T01:11:39.083 回答
0

启发式方法总是会涉及一些误报和一些误报。

压缩文件的最终大小将取决于许多因素,其中一些因素在不运行压缩过程本身的情况下是不可知的。

Zip64 允许您使用许多不同的压缩格式,例如 bzip2、LZMA 等。甚至压缩格式也可能根据要压缩的数据进行不同的压缩。例如,bzip2 可以使用 Burrows-Wheeler、运行长度编码和 Huffman 等。文件的最终大小将取决于被压缩数据的统计属性。

以霍夫曼为例;符号表的大小取决于文件内容的随机分布程度。

可以继续尝试分析不同类型的数据、序列化二进制文件、文本、图像等,并且每种数据的最终压缩大小都会有不同的正态分布。

如果您真的需要通过只执行一次该过程来节省时间,除了构建一个非常大的数据库并使用基于规则的专家系统或基于贝叶斯定理的专家系统之外,没有真正的 100% 方法来解决这个问题。

您还可以尝试以随机间隔对文件的块进行采样并压缩此样本,然后根据文件的大小进行线性插值。

于 2012-01-28T04:20:18.067 回答
0

我只能想到两种方法,一种简单但需要手动调整,另一种可能无法提供足够的好处来证明复杂性是合理的。

  1. 定义一个文件大小,您可以在该大小处跳过压缩尝试,并手动将其调整到您满意的程度。

  2. 在观察到的最小的压缩失败和观察到的最大的成功压缩之间记录最后 N 个文件大小。确定错误选择导致应该压缩的文件不被压缩的可接受概率(比如 5%)。设置您的“不要费心尝试压缩”阈值,这样会导致错误地解压缩的文件百分比。

如果您绝对不会错过压缩应该压缩的文件的机会,那么您已经得到了解决方案。

于 2012-01-28T01:36:52.730 回答