如何在不压缩文件的情况下估计文件的可压缩性?

时间:2012-10-07 15:04:22

标签: python compression twisted

我在扭曲的python中使用基于事件循环的服务器来存储文件,我希望能够根据文件的可压缩性对文件进行分类。

如果他们从压缩中受益的概率很高,他们会转到打开btrfs压缩的目录,否则他们会去其他地方。

我不需要确定 - 80%的准确度会很多,并且可以节省大量的磁盘空间。但由于CPU和fs性能也存在问题,我不能只保存压缩的所有内容。

文件是低兆字节。我不能在不使用大量CPU并过度延迟事件循环或重构压缩算法以适应事件循环的情况下对它们进行测试压缩。

是否有任何最佳做法可以快速估算可压缩性?我想到的是从文件开头拿一小块(几KB)数据,对其进行测试 - 压缩(可能是可以容忍的延迟)并根据该决定做出决定。

有什么建议吗?提示?我的推理和/或问题有缺陷吗?

3 个答案:

答案 0 :(得分:12)

距离文件的中间只有10K就可以了。您不需要开头或结尾,因为它们可能包含不代表文件其余部分的标题或预告片信息。使用任何典型算法,10K足以获得一定程度的压缩。这将预测整个文件的相对压缩量,达到中间10K具有代表性的程度。您获得的绝对比率与整个文件的绝对比率不同,但它与不压缩的数量之间的差异将允许您设置阈值。只需尝试使用多个文件即可查看设置阈值的位置。

如上所述,您可以通过对显然已经压缩的文件执行任何操作来节省时间,例如:巴纽。 .jpg。,.mov,.pdf,.zip等

测量熵不一定是一个很好的指标,因为它只给出零压力可压缩性的估计。如果熵表明它足够可压缩,那么它是正确的。如果熵表明它不够可压缩,那么它可能是也可能不对。您的实际压缩器是一个更好的可压缩性估算器。在1K上运行它不会花费很长时间。

答案 1 :(得分:6)

我认为你要找的是How to calculate the entropy of a file?

此问题包含计算文件熵的所有方法(并且您可以通过它获得文件的'压缩性')。以下是this文章摘要的引用(熵与熵的关系) 测试数据压缩 IEEE成员Kedarnath J. Balakrishnan和IEEE高级成员Nur A. Touba:

  

一组数据的熵是衡量其中包含的信息量的指标。已经使用完全指定数据的熵计算来获得关于可以压缩数据量的理论界限。本文扩展了未完全指定的测试数据(即,具有未指定或不关注位)的熵的概念,并探讨了使用熵来显示如何计算特定符号分区的最大压缩量的界限。研究了将测试数据划分为熵符号的不同方式的影响。对于使用固定长度符号的一类分区,描述了用于指定不关心减少熵的贪婪算法。它被证明等同于最小熵集覆盖问题,因此在指定不关心的所有方式中,相对于最小熵可能在附加常数误差内。描述了可用于近似熵计算的多项式时间算法。针对熵界限分析文献中提出的不同测试数据压缩技术。使用熵理论研究某些类型的测试数据编码策略的局限性和优点

更具建设性,checkout this网站用于python实现数据块的熵计算

答案 2 :(得分:5)

压缩文件通常压缩不好。这意味着几乎任何媒体文件都不会很好地压缩,因为大多数媒体格式已经包含压缩。显然有一些例外,比如BMP和TIFF图像,但你可以建立一个压缩文件类型(PNG,MPEG,并远离视觉媒体 - gzip,bzip2等)的白名单,以跳过然后假设你遇到的其他文件会很好地压缩。

如果您想获得幻想,可以在系统中建立反馈(观察您所做的任何压缩的结果,并将得到的比率与文件类型相关联)。如果您遇到压缩率一直较差的文件类型,可以将其添加到白名单中。

这些想法取决于能够识别文件的类型,但有一些标准实用程序可以很好地完成这项工作(通常比80%好得多) - file(1),/ etc / mime.types等