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

Python 在不压缩文件的情况下,如何估计文件的可压缩性?,python,compression,twisted,Python,Compression,Twisted,我正在TwistedPython中使用一个基于事件循环的服务器来存储文件,我希望能够根据文件的可压缩性对文件进行分类 如果他们从压缩中获益的概率很高,他们会转到打开btrfs压缩的目录,否则他们会转到其他目录 我不需要确定-80%的准确率就足够了,并且可以节省大量磁盘空间。但是,由于CPU和fs的性能问题也存在,我不能只保存压缩的所有内容 文件的大小为低MB。我无法在不使用大量CPU和不适当地延迟事件循环或重构压缩算法以适应事件循环的情况下测试和压缩它们 是否有最佳实践可以快速估算压缩性?我想到

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

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

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

文件的大小为低MB。我无法在不使用大量CPU和不适当地延迟事件循环或重构压缩算法以适应事件循环的情况下测试和压缩它们

是否有最佳实践可以快速估算压缩性?我想到的是从文件的开头取一小块(几kB)的数据,测试压缩它(大概有一个可以容忍的延迟),然后根据这个数据做出决定


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

我想你要找的是

这个问题包含了计算文件熵的各种方法(通过这些方法可以得到文件的“可压缩性”)。这里引用文章摘要(熵和熵之间的关系 测试数据压缩 IEEE成员Kedarnath J.Balakrishnan和IEEE高级成员Nur A.Touba):

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


更具建设性的是,用于python实现的数据块熵计算的checkout站点压缩文件通常不能很好地压缩。这意味着几乎任何媒体文件都不会很好地压缩,因为大多数媒体格式已经包含压缩。显然也有例外,例如BMP和TIFF图像,但您可能可以构建一个良好压缩文件类型的白名单(PNG、MPEG和脱离可视媒体的冒险—gzip、bzip2等),跳过,然后假设遇到的其他文件将得到良好压缩

如果您喜欢,可以在系统中构建反馈(观察您所做的任何压缩的结果,并将结果比率与文件类型关联)。如果遇到一个文件类型的压缩性能一直很差,可以将其添加到白名单中

这些想法取决于能否识别文件的类型,但有一些标准实用程序在这方面做得相当好(通常比80%好得多)-文件(1),/etc/mime.types等等。

距离文件中间仅10公里即可。您不需要开头或结尾,因为它们可能包含不代表文件其余部分的头或尾信息。对于任何典型的算法,10K足以获得一定程度的压缩。这将预测整个文件的相对压缩量,以中间10K为代表。您得到的绝对比率将与整个文件的绝对比率不同,但它与未压缩的绝对比率不同的量将允许您设置阈值。只需对许多文件进行实验,看看在哪里设置阈值

如前所述,您可以通过对明显已压缩的文件(如png)不做任何操作来节省时间。jpg.、.mov、.pdf、.zip等


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

简单地说,您没有提到您计划使用的压缩算法。话虽如此,我认为至少检查一次文件是不行的。为什么不能使用渐进式压缩呢?压缩一小部分是没有帮助的:如果文件的其余部分只是从这个部分的副本中复制出来的,那么就很容易压缩。恐怕唯一好的解决办法是尝试压缩整个文件。将所有内容保存到未压缩的目录中,然后在后台线程中将内容迁移到压缩的目录中如何?迁移器可以在将迁移发布回其他线程之前检查是否已实现可接受的压缩。相关:如果文件的开头(以及mime类型)是给定的,而不是给定的,则这将是最佳解决方案。它更像是任意数据块,可能经常是可压缩的。当然,你必须有某种方法来压缩数据