在 xz、gzip 和 bzip2 之间,哪种压缩算法在压缩相当大的 tarball 时可以产生最小的文件大小和最快的速度?
答案1
在我的压力测试中,我使用列出的三种格式压缩了 464 MB 的数据。Gzip 返回了一个 364 MB 的文件。Bzip2 返回了一个 315 MB 的文件。Xz 返回了一个 254 MB 的文件。我还做了一个简单的速度测试:
压缩:
1:Gzip
2:Xz
3:Bzip2(运行过程中,我的风扇不停地转,说明我的 Athlon II 相当吃力)
减压:
1:Xz
2:Gzip
3:Bzip2
请注意,所有这些测试都是使用最新版本的 7-Zip 完成的。
Xz 是最佳的全面压缩格式,而 Gzip 的速度非常快。Bzip2 的压缩率不错,不过最好用 xz 来代替。
答案2
我认为这篇文章提供了非常有趣的结果。
http://pokecraft.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO
最节省尺寸的格式是 xz 和 lzma,两者都传递了 -e 参数。
目前最快的算法是 lzop 和 lz4,它们可以在 1.3 秒内达到与 gzip 相差不大的压缩级别,而 gzip 则需要 8.1 秒。lz4 的压缩率为 2.8,gzip 的压缩率为 3.7。
以下是我从这篇文章中提取的一些结果:
Gzip:8.1秒@3.7
lz4:1.3秒@2.8
xz:32.2秒@5.43
xz -e : 6m40 @ 7.063
- xz:4分51秒@7.063
因此,如果您确实迫切需要速度,lz4 非常棒,并且仍然提供 2.8 的压缩比。
如果你迫切需要节省字节,那么对于像内核源代码这样的文本文件,最大压缩级别 (9) 的 xz 效果最好。但是,它很长,占用大量内存。
在需要最小化时间和空间影响时,gzip 是一个很好的选择。我会用它对生产环境进行每日手动备份。
答案3
我对 1.1GB Linux 安装 vmdk 映像进行了自己的基准测试:
rar =260MB comp= 85s decomp= 5s
7z(p7z)=269MB comp= 98s decomp=15s
tar.xz =288MB comp=400s decomp=30s
tar.bz2=382MB comp= 91s decomp=70s
tar.gz =421MB comp=181s decomp= 5s
所有压缩级别都调到最大,CPU Intel I7 3740QM,内存 32GB 1600,源和目标位于 RAM 磁盘上
我通常使用 rar 或 7z 来存档文档等普通文件。
对于存档系统文件,我使用 file-roller 的 .tar.gz 或 .tar.xz 或 tar 以及 -z 或 -J 选项以及 --preserve 来使用 tar 进行本地压缩并保留权限(也可以使用 .tar.7z 或 .tar.rar)
更新:由于 tar 只保留正常权限而不是 ACL,因此也可以使用普通的 .7z 加上通过 getfacl 和 sefacl 手动备份和恢复权限和 ACL,这似乎是文件归档或系统文件备份的最佳选择,因为它将完全保留权限和 ACL,具有校验和、完整性测试和加密功能,唯一的缺点是 p7zip 并非在所有地方都可用
答案4
此外:当您想要从包含大量重复文件的文件夹结构中压缩 tarball 时,输出大小会有显著差异。
您可以针对您的大型 tarball(在我的情况下有许多重复文件)情况调整压缩。这意味着:
- 使用在实际压缩之前进行重复数据删除的工具,如 squashfs 或 libwim
- 使用可以创建具有可靠机制的档案的工具,如 7zhttps://en.wikipedia.org/wiki/Solid_compression
- 并使用 xz/gzip/bzip2/etc 的 dictionary-size 和 solid-chunk-size(如果可用)。这对具有重复部分的大型文件有显著影响。
我的示例数据集是 1GB 的原始数据。几个 dll 文件,其中很多是重复的。使用简单压缩,我得到了大约 150MB 的 xz/gz/etc 档案。
我最好的结果是 9 秒内传输 40MB wimcapture data out.wim --compress=none --solid --solid-chunk-size=1M
。
在研究过程中,我还偶然发现https://github.com/mhx/dwarfs值得一看。它结合了现代压缩、重复数据删除和速度。