压缩许多类似的大文件


18

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

单个文件可以从30 MB压缩到13-15 MB(有xz -1gz -1bzip2 -1),但在压缩两个或多个文件时,我想有存档与大小13-15MB + N*0.3MB,其中N是文件的数量。

当使用tar(创建可靠的存档)和xz -6(将压缩字典定义为大于一个文件- 更新-这还不够!)时,我仍然拥有size的存档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


运行xz -1 --memory=2G无济于事,已对2个和4个文件进行了测试。
osgx 2014年

Answers:


12

根据您的详细信息,我假设您已验证文件确实具有99%的公用数据,并且它们之间有连续(或几乎连续)的1%的差异。

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

然后,必须使用xz进行设置,以使字典大于一个文件的大小。由于您没有说是否有内存限制,因此我会使用xz -9。没有使用所有可用内存没有任何意义。

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

字典大小

在我可以使用的一个文档(站点)中,据说字典的大小大致等于解压缩器的内存使用量。而-1参数表示1MiB的字典,-6参数表示10 MiB(或同一手册的另一部分中的8 MiB)。这就是为什么将这些文件一起打包无法获得任何好处的原因。使用-9将使分解器(因此,字典)成为64 MiB,我想这就是您想要的。

编辑

另一种可能性是使用另一台压缩机。我会使用7zip,但是先将这些文件焦油,然后再压缩7zip。

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

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


Xz和7-Zip都使用LZMA2,所以那里没有任何好处。PPMD经过优化,可从已经压缩的媒体(例如MP3和视频)中以极慢但极高的压缩率进行熵提取。不太可能找到两个文件之间的巨大相似性并将它们存储在字典中-与LZMA2相似的可能性不大。
allquixotic 2014年

woliveirajr,不使用-1或不使用-9预置,而是指定dict=64MBdict=128MB设置mode=fast怎么办?
osgx 2014年

使用dict = xxMB而不是-1或-9可以直接解决问题,但是由于我不知道xz在仅使用-9时如何设置其他参数,所以我不知道您是否会错过任何内容其他。我认为您的方向是正确的,只需进行测试即可为您提供准确的答案。
woliveirajr 2014年

3
通过这种方式,xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G我能够将250个文件(7.5 GB)压缩为18 MB的tar.xz存档。
osgx 2014年

@osgx :)很好。如果不需要太多时间(即在您的需要之内),问题就解决了!:)因此,您的final_size = 13MB + x * 6kB,或多或少。
woliveirajr 2014年

9

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

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

  • 将任意文件作为“基准”
  • 运行bsdiff比较基准文件与每个其他文件的比较
  • 将每个差异与基线文件一起存储为单独的文件
  • xz对结果(基线+差异)进行压缩。

结果应该比仅对xz整个归档文件小得多。

然后,您可以通过“在基线之上”应用差异来“重构”原始文件,以获取其他文件。


不累积。(“每对文件都具有99%的相同数据...”)
osgx 2014年

1
如果差异不是累积的,那么这应该是该bsdiff算法的良好应用。试试看。
allquixotic

感谢您的回答,但我已经使用xz:tar c directory|xz --lzma2=dict=128M,mode=fast和删除的输入文件完成了任务。实际上,我的输入文件是文本,所以我什至可以使用diff代替bsdiff(我的PC上未安装)。
osgx 2014年

5

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.