压缩许多类似的大文件

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.

我认为无论是gzipbzip2不会帮助我,因为他们有字典小于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)。

  • 使用 `xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G` 我能够将 250 个文件(7.5 GB)压缩到 18 MB tar.xz 存档。 (3认同)

all*_*tic 9

如果它们真的像你说的 99% 相似,你应该能够使用bsdiff或类似的算法来计算文件之间的差异。差异是累积的(即,每个文件与第一个文件的差异更大一些),还是任意两个文件之间的差异几乎相同?

如果它不是累积的,您应该能够:

  • 以任意文件为“基线”
  • 运行bsdiff比较基线文件与每个附加文件
  • 将每个差异存储为一个单独的文件,与基线文件一起
  • xz跨结果一样运行压缩器(基线 + 差异)。

结果应该比仅仅xzing 整个存档小得多。

然后,您可以通过“应用”基线顶部的差异来“重建”原始文件,以获取其他每个文件。


osg*_*sgx 5

您 (I) 可以将 tar 与一些能够进行远程模式检测的归档程序一起使用,例如rziplrzip (自述文件)。两者都使用远程冗余检测/重复数据删除,然后 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)将大文件分成块。