压缩冗余文件数据

时间:2017-04-16 14:01:43

标签: compression

我有一个巨大的ASCII文件:

235M Apr 16 06:50 file

我做了以下步骤:

cat file > file_all

cat file >> file_all

470M Apr 16 06:51 file_all

file_1_2的大小是file_1 = 470

的2 *大小

我使用zip压缩命令来压缩file_1和file_all:

25M Apr 16 06:08 file_all.gz

49M Apr 16 06:25 file_all.gz

根据我的理解,压缩算法具有以下概念:

  

ZIP压缩基于数据中的重复模式   压缩,压缩越好,文件越长,如   可以找到并使用越来越多的模式。

问题

为什么我不能利用重复? 1兆是唯一的好处吗?

P.S:我用bz2做了同样的程序和相同的注释[区别仅在于压缩尺寸本身] 感谢

2 个答案:

答案 0 :(得分:1)

这确实是预期的结果。

zip压缩算法确实依赖于在输入中查找重复序列。但是,在内存和存储方面,找到所有重复在计算上都是昂贵的。保持足够的信息来检测重复的四分之一千兆字节将非常昂贵,而且我所知道的压缩机甚至接近这个尺寸。

相反,压缩器在有限大小的滑动窗口内寻找重复。在zip(和gzip)的情况下,这可以使用命令行参数进行配置,但最大的窗口远小于1兆字节。 (高度重复的输入,例如只包含零的文件,可以进行更多的压缩,因为重复的序列可以在窗口本身中进行压缩。但一般来说,这对长时间重复的序列没有帮助。)

Bzip2使用不同的策略,但它也需要限制分析输入的大小以避免过多的运行时间。正如bzip2 manual中所解释的那样,bzip2将输入分解为块并独立地处理每个块。默认(和最大)块大小为900,000字节,这将不允许它利用多兆字节重复序列。

答案 1 :(得分:1)

具有远距离回溯的压缩器以前仅限于7z(如提到的Adler),而鲜为人知的压缩器如lrzip。但是随着zstd成为主流,典型的安装也可能会具备该功能。

为了模拟大型ASCII文件,我使用了enwik8数据。我运行了以下命令:

while

文件大小为:

cat enwik8 enwik8 > enwik82
zstd enwik8
zstd enwik82
zstd --long enwik8 -o enwik8.long.zst
zstd --long enwik82 -o enwik82.long.zst

如此长距离匹配就可以了! (请注意,默认的100000000 enwik8 35633676 enwik8.long.zst 36445475 enwik8.zip 35626935 enwik8.zst 200000000 enwik82 35644486 enwik82.long.zst 71251491 enwik82.zst 窗口大小是128 M,而您需要为--long设置256 M窗口。)

一些计时信息:

--long=28

远程匹配显然也使它更快。手册说它可以在多线程上正常工作,但是我现在懒得去测试。

相关问题