osg*_*sgx 20 compression tar archiving xz
我有数百个类似的大文件(每个 30 兆字节)要压缩。每对文件都有 99% 的相同数据(差异小于 1%),所以我希望存档不超过 40-50 兆字节。
单个文件可以从 30 MB 压缩到 13-15 MB(使用xz -1, gz -1, bzip2 -1),但是在压缩两个或更多文件时,我希望存档的大小为13-15MB + N*0.3MBN 是文件数。
当使用tar(创建实体存档)和xz -6(定义压缩字典大于一个文件 -更新 - 这还不够!)时,我仍然有大小为N*13MB.
我认为无论是gzip和bzip2不会帮助我,因为他们有字典小于1 MB,和我的焦油物流有重复,每30 MB。
如何使用标准工具在现代 Linux 中归档我的问题?
是否可以调整xz以快速压缩,但使用大于 30-60 MB 的字典?
更新:用tar c input_directory | xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G > compressed.tar.xz. 不确定必要的mf=hc4和--memory=2G选项;但是dict=128M将字典设置得足够大(大于一个文件),mode=fast并使该过程比-e.
wol*_*ajr 13
鉴于您的详细信息,我假设您已验证您的文件确实有 99% 的数据是相同的,并且它们之间存在连续(或几乎连续)1% 的差异。
首先,您应该使用 tar 将您的文件制作成一个存档。对于测试,我将创建一个包含 10 个文件的 .tar,因此大小为 300MB。
然后,使用 xz,您必须将其设置为字典大于一个文件的大小。既然你没有说你是否有内存限制,我会选择 xz -9。不使用所有可用内存是没有意义的。
我还会使用 --extreme 预设来测试它是否有所不同。
字典大小
在我可用的一个文档中 -站点- 据说字典大小大致等于解压缩器的内存使用量。-1 参数表示 1MiB 的字典,-6 表示 10 MiB(或同一手册的另一部分中的 8 MiB)。这就是为什么将这些文件打包在一起没有任何好处。使用 -9 将使解压缩器(以及字典)为 64 MiB,我认为这就是您想要的。
编辑
另一种可能性是使用另一个压缩机。我会使用 7zip,但会先对这些文件进行 tar 压缩,然后再对它们进行 7zip 压缩。
根据您的文件内容,也许您可以使用 7zip 和 PPM-D 方法(而不是 LZMA 或 LZMA2,这是默认值,与 xz 使用的相同)
不好:Zip (dict = 32kB)、Bzip (dict = 900 kB)。
您 (I) 可以将 tar 与一些能够进行远程模式检测的归档程序一起使用,例如rzip或lrzip (自述文件)。两者都使用远程冗余检测/重复数据删除,然后 rzip 使用 bzip2,lrzip 使用 xz(lzma)/ZPAQ:
rzip 是一个压缩程序,在功能上类似于 gzip 或 bzip2,但能够利用文件中的长距离冗余,这有时可以使 rzip 产生比其他程序更好的压缩率。... rzip 的主要优点是它具有 900 MB 的有效历史缓冲区。这意味着与其他常用的压缩程序相比,它可以在很远的距离内找到输入文件的匹配部分。相比之下,gzip 程序使用了 32 KB 的历史缓冲区,而 bzip2 使用了 900 KB 的历史缓冲区
lrzip 具有更大的缓冲区,并且可以在重复数据删除后使用许多压缩算法(非常快、快、好,并且是最好的之一 - ZPAQ):
Lrzip 使用 rzip 的扩展版本,它执行第一遍长距离冗余减少。lrzip 修改使其根据内存大小进行缩放。
然后数据是: 1. 由 lzma(默认)压缩,它以大约 bzip2 压缩速度的两倍提供出色的压缩...
另一种方法是使用bup - 基于 git packfile 的块级/段级重复数据删除备份程序:
它使用滚动校验和算法(类似于 rsync)将大文件分成块。