为什么tar存档格式切换到xz压缩以替换bzip2,而gzip呢?


202

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

有什么具体原因可以解释为什么会发生这种情况,以及gzip在这种情况下有什么意义?

history  gzip  bzip2  xz 

Answers:


198

为了通过Internet分发档案,通常优先考虑以下事项:

  1. 压缩率(即压缩器生成数据的大小);
  2. 减压时间(CPU要求);
  3. 减压记忆要求;和
  4. 兼容性(解压缩程序的普及程度)

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

与bzip2相比,xz的压缩率更高,解压缩时间更短(更好)。但是,在通常使用的压缩设置下,它需要更多的内存来解压缩[1],并且分布范围较小。Gzip使用的内存少于两个。

因此,发布了gzip和xz格式的档案,您可以选择:

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

实际的因素组合并没有使您选择bzip2。因此,它正在逐步淘汰。

我在博客文章中查看了压缩比较。我没有尝试复制结果,我怀疑其中的一些变化(大多数情况是最新的,我希望xz它有所改善。)

(在某些特定情况下,良好的bzip2实现可能比xz更可取:bzip2可以压缩比0z更好的具有很多零和基因组DNA序列的文件。新版本的xz现在具有(可选)块模式,可以进行数据恢复在破坏和并行压缩以及[理论上]解压缩之后。以前,只有bzip2提供了这些。[2]但是这些都与内核分发无关。


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

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


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

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

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

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

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

45

首先,这个问题与不直接相关tar。Tar只会创建一个未压缩的存档,随后将应用压缩。

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

但是,如果需要高压缩比,则LZMA2 bzip2几乎在所有方面都表现出色。压缩速度通常较慢,但以更快的速度解压缩并以更高的内存使用为代价提供了更好的压缩率。

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

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


4
好吧,有些焦油使它成为一种z选择。
tchrist

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

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

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

19

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


链接断开。
flarn2006

18

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


2
确实,这是一个非常有用和重要的区别!
leden
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.