如何有效地预测数据是否可压缩

2022-09-01 23:16:26

我想编写一个存储后端来存储更大的数据块。数据可以是任何东西,但它主要是二进制文件(图像,pdf,jar文件)或文本文件(xml,jsp,js,html,java...)。我发现大部分数据已经压缩。如果所有内容都压缩,则可以节省大约15%的磁盘空间。

我正在寻找最有效的算法,可以很有可能地预测一个数据块(假设128 KB)可以被压缩或不压缩(无损压缩),而不必查看所有数据(如果可能的话)。

压缩算法将是LZF,Deflate或类似的东西(可能是Google Snappy)。因此,预测数据是否可压缩应该比压缩数据本身快得多,并且使用更少的内存。

我已经知道的算法:

  • 尝试压缩数据的子集,假设128字节(这有点慢)

  • 计算128字节的总和,如果它在一定范围内,那么它很可能是不可压缩的(在128 * 127的10%以内)(这很快,而且相对不错,但我正在寻找更可靠的东西,因为算法实际上只查看每个字节的最上面的位)

  • 看看文件头(相对可靠,但感觉像作弊)

我想一般的想法是,我需要一种算法,可以快速计算字节列表中每个位的概率是否大约为0.5。

更新

我已经实现了“ASCII检查”,“熵计算”和“简化压缩”,并且都给出了很好的结果。我想改进算法,现在我的想法是不仅要预测数据是否可以压缩,还要预测可以压缩多少数据。可能使用算法的组合。现在,如果我只能接受多个答案...我将接受给出最佳结果的答案。

仍然欢迎其他答案(新想法)!如果可能的话,使用源代码或链接:-)

更新 2

类似的方法现在在Linux中实现


答案 1

根据我的经验,几乎所有可以有效压缩的格式都是非二进制的。因此,检查大约70-80%的角色是否在[0-127]愤怒中应该可以解决问题。

如果你想“正确地”使用它(即使我真的看不出这样做的理由),你要么必须在数据上运行(部分)压缩算法,要么计算熵,就像tskuzzy已经提出的那样。


答案 2

计算数据的。如果它具有高熵(~1.0),则不太可能进一步压缩。如果它具有低熵(~0.0),则意味着其中没有很多“信息”,可以进一步压缩。

它提供了一段数据可以得到的压缩程度的理论度量。


推荐