有没有办法获得文件的可能压缩率只是读取它?
你知道,有些文件比其他文件更容易压缩……我的软件必须告诉我文件可能压缩的百分比。
例如
Compression Ratio: 50%
-> 如果我压缩它,我可以节省 50% 的文件空间 -> 如果我压缩它
Compression Ratio: 99%
,我只能节省 1% 的文件空间
3 回答
首先,这在很大程度上取决于您选择的压缩方法。其次,我严重怀疑如果不计算与实际进行压缩相比的时间和空间复杂度,这是可能的。我想说你最好的选择是压缩文件,跟踪你已经生成的文件的大小并删除/释放它(一旦你完成它,显然)而不是写出来。
要真正做到这一点,除非您真的想自己实现它,否则使用java.util.zip类可能是最简单的,尤其是Deflater
该类及其deflate
方法。
不检查文件是不可能的。您唯一能做的就是根据通过实际压缩和测量从相对较大的样本中收集的统计信息,按文件扩展名获得近似比率。例如,统计分析可能会显示 .zip、.jpg 不可高度压缩,但 .txt 和 .doc 之类的文件可能可高度压缩。
其结果仅供粗略指导,并且在某些情况下可能会有所偏差,因为绝对不能保证文件扩展名的可压缩性。该文件可以包含任何内容,无论扩展名说什么,它可能是也可能不是。
更新:假设您可以检查文件,那么您可以使用java.util.zip
API 读取原始文件并压缩它,看看之前/之后的区别是什么。
首先,您需要研究信息论。关于信息论领域有两种理论:
- 根据香农的说法,可以通过使用它的符号概率来计算源的熵(即压缩大小)。因此,由在每一步产生符号概率的统计模型定义的最小压缩大小。所有算法都隐式或显式地使用该方法来压缩数据。查看该Wikipedia 文章以获取更多详细信息。
- 根据 Kolmogorov 的说法,最小的压缩大小可以通过找到产生源的最小可能程序来找到。从这个意义上说,它不可能是可计算的。一些程序部分地使用这种方法来压缩数据(例如,您可以编写一个可以生成 100 万位 PI 的小型控制台应用程序,而不是压缩那 100 万位 PI)。
因此,如果不评估实际压缩,就无法找到压缩大小。但是,如果您需要一个近似值,您可以依靠香农的熵理论并建立一个简单的统计模型。这是一个非常简单的解决方案:
- 计算源文件中每个符号的 order-1 统计信息。
- 使用这些统计数据计算熵。
您的估计将或多或少与 ZIP 的默认压缩算法(放气)相同。这是相同想法的更高级版本(请注意它使用大量内存!)。它实际上使用熵来确定块边界,以应用分段将文件划分为同质数据。