越来越多的tar存档使用基于LZMA2的xz格式进行压缩,而不是使用传统的bzip2(bz2)压缩。实际上,kernel.org在2013年12月27日发布了“ Good-bye bzip2”最新公告,表示从那时起内核资源将以tar.gz和tar.xz格式发布-并在网站的主页上发布在tar.xz中直接提供了什么。

是否有任何特定的原因来解释为什么会发生这种情况,以及在这种情况下gzip的意义是什么?

#1 楼

对于通过Internet分发档案,通常需要优先考虑以下事项:压缩率(即压缩器生成数据的大小);压缩时间(CPU要求) );
解压缩内存要求;和
兼容性(解压缩程序的普及程度)

压缩内存和CPU的要求不是很重要,因为您可以为此使用大型快速计算机,只需执行一次。

与bzip2相比,xz的压缩率更高,解压缩时间更短(更好)。但是,在通常使用的压缩设置下,它需要更多的内存来进行解压缩[1],并且普及程度较低。 Gzip占用的内存少于任何一个。

因此,gzip和xz格式的存档都已发布,允许您选择:


需要在具有以下功能的计算机上解压缩内存非常有限(<32 MB):gzip。给定的,在谈论内核资源时不太可能。
需要解压缩最少的可用工具:gzip
想要节省下载时间和/或带宽:xz

确实是各种因素的现实组合,使您选择bzip2。因此它已被淘汰。

我在博客文章中介绍了压缩比较。我没有尝试复制结果,我怀疑其中一些已经改变(大多数情况下,我希望xz有所改进,因为它是最新的。)

(在某些特定情况下, bzip2的实现可能比xz更好:bzip2可以比xz更好地压缩具有多个零和基因组DNA序列的文件。xz的新版本现在具有(可选)块模式,该模式允许在损坏,并行压缩和[理论上]解压缩。以前,只有bzip2提供这些功能。[2]但是这些都与内核分发无关。


1:在存档大小中,xz -3约为bzip -9。然后,xz使用较少的内存进行解压缩。但是xz -9(例如,用于Linux内核tarball)所使用的内容远远超过bzip -9。 (甚至xz -0都需要超过gzip -9)。

2:F21系统范围的更改:lbzip2作为默认bzip2实现

评论


关于容错性的任何评论,还是总是完全在压缩算法之外实现的东西?

–user44370
2014年1月8日下午1:00

在不牺牲压缩率的情况下,无法提供@illuminÉ弹性。这是一个正交的问题,尽管存在诸如Parchive之类的工具,但用于分发内核TCP的错误处理的功能也同样有效。

–东武
2014年1月8日在8:58

@illuminÉ容错(假设您的意思类似于par2)通常与通过Internet分发档案无关。假定下载足够可靠(如果损坏,则可以重新下载)。经常使用加密哈希和签名,它们可以检测到损坏以及篡改。有一些压缩机具有更大的容错能力,尽管是以压缩比为代价的。似乎没有人发现值得在HTTP或FTP下载上进行权衡的东西。

–德罗伯特
2014年1月8日在17:02



xz使用较少的内存进行解压缩。

– MichalH
15年8月11日在11:32

@Mike自从我写这篇文章以来,它发生了变化吗?特别地,脚注一解释了内存使用情况。

–德罗伯特
2015年8月11日14:03

#2 楼

首先,这个问题与tar不直接相关。 Tar只会创建一个未压缩的存档,然后再进行压缩。

与LZMA2和bzip2相比,Gzip相对较快。如果速度很重要,则gzip(尤其是多线程实现pigz)通常是压缩速度和压缩率之间的良好折衷。尽管有其他方法可以解决速度问题(例如LZ4)。

但是,如果需要高压缩比,LZMA2几乎在所有方面都胜过bzip2。压缩速度通常较慢,但是以更高的内存使用为代价,它的解压缩速度更快,并且压缩率更高。

除了向后兼容以外,没有太多理由再使用bzip2 。此外,LZMA2在设计时就考虑到了多线程,并且默认情况下许多实现都使用多核CPU(不幸的是,Linux上的xz尚未这样做)。这是有道理的,因为时钟速度将不再增加,但内核数将增加。

有多线程bzip2实现(例如pbzip),但是默认情况下通常不安装它们。另请注意,与LZMA2相比,多线程bzip2仅在压缩时才有回报,而如果文件是使用单线程bzip2压缩的,则解压缩将使用单线程。如果文件是使用并行bzip2版本压缩的,则并行bzip2变体只能利用多核CPU,通常不是这种情况。

评论


好吧,有些焦油打了一个z选项。

–基督
2014年1月7日,1:19

“速度”是一个糊涂的答案,您应该指压缩速度或解压缩速度。缺省情况下未安装pixz,pbzip2或pigz(或不带-I标志的tar使用),但是pixz和pbzip2可以加快压缩和解压缩速度,而Pigz仅用于压缩。

–东武
2014年1月8日在8:33

@Tobu xz默认情况下是多线程的,因此将来不需要安装pixz。在某些平台上,已经支持xz线程。而bzip2不太可能是多线程的,因为该格式在设计时并未考虑多线程。此外,只有在使用pbzip2压缩文件的情况下,pbzip2才加速解压缩,而通常情况并非如此。

–马可
2014年1月8日,12:07

@Marco我相信lbzip2允许对文件进行并行解压缩,即使文件是使用非并行实现压缩的(例如,股票bzip2)。这就是为什么我在lbzip2上使用lbzip2的原因。 (自您发表评论以来,情况可能已经有所发展。)

–RaveTheTadpole
2015年1月20日在6:09



这是有道理的,因为时钟速度不再增加-什么?这不是真的。该帖子发表于2014年,当时英特尔发布了3.8GHz的i3-4370。 2017年,英特尔发布了4.7GHz的i7-8700K。在2018年,他们发布了5GHz的i9-9900K-可能在2015年和2016年的cpus也在此列表中缺失

– hanshenrik
20 Mar 11 '20 at 9:54

#3 楼

LZMA2是一个块压缩系统,而gzip不是。这意味着LZMA2适合于多线程。另外,如果存档中发生损坏,通常可以使用LZMA2从后续块中恢复数据,但不能使用gzip进行恢复。实际上,在损坏的块之后,使用gzip会丢失整个存档。使用LZMA2存档,您只会丢失受损坏块影响的文件。这对于具有多个文件的较大存档来说很重要。

评论


确实,这是一个非常有用和重要的区别!

–leden
17年1月4日在16:49



您可以使用来源支持这些声明吗?我还没有看到XZ恢复工具,而我的已知消息来源则宣称:nongnu.org/lzip/xz_inadequate.html

– nyov
19/12/16在9:05

#4 楼

简短的回答:xz在压缩率方面更有效。这样可以节省磁盘空间并优化通过网络的传输。
您可以查看此快速基准测试,以便通过实际测试发现差异。

评论


链接断开。

– Flarn2006
19年6月10日在18:49

新链接:catchchallenger.first-world.info/wiki/…

–克雷格·扬金斯(Craig Younkins)
20年1月25日在18:17