9

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

如果他们从压缩中受益的可能性很高,他们会去一个打开 btrfs 压缩的目录,否则他们会去其他地方。

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

这些文件是低兆字节。如果不使用大量 CPU 并过度延迟事件循环或重构压缩算法以适应事件循环,我就无法测试压缩它们。

是否有任何最佳实践可以快速估计可压缩性?我想出的是从文件的开头获取一小块(几 kB)数据,测试压缩它(可能有一个可以容忍的延迟)并以此为基础做出决定。

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

4

3 回答 3

12

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

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

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

于 2012-10-07T17:11:10.633 回答
6

我认为您正在寻找的是如何计算文件的熵?

这个问题包含各种计算文件熵的方法(通过它你可以获得文件的“可压缩性”)。这是本文摘要的引述(熵与测试数据压缩之间的关系 Kedarnath J. Balakrishnan,IEEE 成员和 Nur A. Touba,IEEE 高级成员):

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

为了更具建设性,请查看站点以获取数据块熵计算的 python 实现

于 2012-10-07T15:15:58.550 回答
5

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

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

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

于 2012-10-07T15:27:13.750 回答