我有一个巨大的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做了同样的程序和相同的注释[区别仅在于压缩尺寸本身] 感谢
答案 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
远程匹配显然也使它更快。手册说它可以在多线程上正常工作,但是我现在懒得去测试。