有效压缩相似文件


11

我经常需要压缩彼此非常相似的文件。

目前,我使用7Zip,它使用具有Ultra设置的8个内核在大约35分钟的时间内将16GB的文件压缩为1.2GB。

在我看来,大部分时间都花在计算字典上以用于压缩。由于文件高度相似,因此实际使用的字典也可能相似。

是否有一个基于Windows的压缩工具(带有我不知道的选项的7Zip或其他工具)可以保存词典并将该保存的词典重新用于后续文件?

是否有更好的方法来解决与我保持相似的压缩率同时压缩速度明显加快的问题?

Answers:


5

所述的Lempel-谢夫-韦尔奇(LZW)压缩算法本质上是计算密集的,大部分工作本身是实际计算字典。这实际上就是LZW的工作方式。

该算法本身会为其扫描的下一个“符号”添加一个新的词典条目,因此,在每次迭代中,都会向该词典中添加一个新条目。实际上,字典成为文件的压缩副本,因此实际上是LZW压缩首先花费大量时间进行计算的唯一方法


如果您使用类似Huffman编码的方法,则确实可以重用字典(以可能的次优压缩率/大小为代价)。但是,大多数现代压缩算法和工具都使用LZW算法来提高效率和速度(霍夫曼压缩将需要对数据进行两次遍历(一次生成霍夫曼树/表,另一遍实际压缩数据),而LZW可以在单次通过)。


1
使用霍夫曼和预定义的词典,是否只需要通过一遍?是否有任何基于霍夫曼的现成工具都支持保存的词典?
Eric J.

@EricJ。是的,使用预定义的字典将是单遍编码。尽管我有个人编写的程序可以执行此操作,但我不知道可以立即使用的任何软件。虽然我还没有尝试过,但该工具似乎可以做到这一点。但是,请注意(再次与LZW不同)对Huffman编码的比特流进行解码,您仍然需要原始字典来解压缩数据。
突破

根据该工具的使用年限,我猜它是单线程的。我猜使用1个核心,而不是8将抵消任何好处,以一个固定的字典:-(具有字典可用的另一端是我的方案是可行的(传输数据中心之间的大型文件)。
埃里克J.

2

与DEFLATE算法不同,默认情况下7-Zip的LZMA使用固态压缩,这充分利用了文件间冗余。只要文件足够小,就可以使用默认设置。

使用Solid Block size的默认设置为2 GB时,实际上会将16 GB的文件压缩为8个单独的块。

正如@Breakthorugh所说,该词典是即时生成的。您可以通过将“ 实体块”大小设置为“ 实体”(一次压缩所有文件)和“ 非实体”(分别压缩每个文件)来凭经验进行验证。

增加Solid Block大小实际上会导致速度变慢,但可能会导致更好的压缩率。例如,压缩两个相同的文件将导致归档文件的大小几乎是非实体压缩文件的两倍。


1
就我而言,我在不同的场合一次压缩一个相似的文件。在给定的存档中,每个文件只有16GB。
Eric J.

喔好吧。我误解了。创建新档案后,旧档案会被删除吗?如果否,是否可以在一个档案中存储多个文件?这对压缩速度没有帮助,但是取决于文件的实际相似程度,可能对压缩率有所帮助。
丹尼斯

1
没关系,事实并非如此。更新可靠的存档需要花费更多时间,但是并不能带来更好的压缩效果。
丹尼斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.