压缩许多类似的大文件

压缩许多类似的大文件

我有数百个类似的大文件(每个 30 兆字节)需要压缩。每对文件都有 99% 相同的数据(差异不到 1%),因此我预计存档大小不超过 40-50 兆字节。

单个文件可以从 30 MB 压缩到 13-15 MB(使用xz -1gz -1bzip2 -1),但压缩两个或更多文件时,我希望得到大小为 N 的存档,13-15MB + N*0.3MB其中 N 是文件的数量。

当使用tar(创建固实档案)和xz -6(将压缩字典定义为大于一个文件时 -更新-这还不够!),我仍有 大小的档案N*13MB

我认为和都对gzipbzip2没有帮助,因为它们的字典小于 1 MB,而我的 tar 流每 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

答案1

根据您的详细信息,我假设您已经验证您的文件确实有 99% 的共同数据,并且其中有连续(或几乎连续)的 1% 的差异。

首先,您应该使用 tar 创建一个包含文件的存档。为了进行测试,我将创建一个包含 10 个文件的 .tar 文件,因此大小为 300MB。

然后,使用 xz,您必须将其设置为字典大于一个文件的大小。由于您没有说明是否有内存限制,因此我建议使用 xz -9。不使用所有可用内存是没有意义的。

我还将使用 --extreme 预设来测试它是否有所不同。

词典大小

在一份我手头有的文档中 -地点- 据说字典大小大致等于解压缩器的内存使用量。 -1 参数表示字典大小为 1MiB,-6 表示 10MiB(或在同一手册的另一部分中为 8MiB)。这就是为什么将这些文件打包在一起没有任何好处的原因。使用 -9 会使解压缩器(以及字典)的大小为 64MiB,我认为这就是您想要的。

编辑

另一种可能性是使用其他压缩器。我会使用 7zip,但会先将这些文件打包成 tar,然后再使用 7zip 压缩。

根据文件内容,也许您可​​以使用带有 PPM-D 方法的 7zip(而不是 LZMA 或 LZMA2,这是默认方法,与 xz 使用的方法相同)

不好:Zip (dict = 32kB)、Bzip (dict = 900 kB)。

答案2

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

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

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

xz结果应该比仅仅处理整个档案要小得多。

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

答案3

你(我)可以将 tar 与一些能够进行远程模式检测的归档器一起使用,例如,压缩或者压缩自述)。两者都使用长距离冗余检测/重复数据删除,然后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 压缩的两倍……

其他方法是使用布普- 基于 git packfile 的具有块/段级重复数据删除功能的备份程序:

它使用滚动校验和算法(类似于 rsync)将大文件分成块。

相关内容