不同的“压缩”系统之间有什么区别?


9

我一直使用TAR和ZIP进行压缩,但是最近我听说了*.Z压缩算法。这给我提出了一个问题:

对于所有这些压缩系统,哪一种最适合常规使用和压缩?

通过运行一些测试,我发现tar并没有真正压缩(除非明确指定)。意思是,与其他压缩方法相比有什么好处?

我已经知道ZIP是使用最广泛的压缩系统,但我应该用它代替*.Z*.7z.tar,或.tar.<insert ending here>

帖子摘要:

  1. 我应该使用*.tar*.Z*.7z.tar,或.tar.<insert ending here>最好的压缩?
  2. 如果Plain *.tar无法压缩,为什么要使用它?

编辑:并非所有算法都允许存储Linux权限(据我了解)。哪一个能做,还有可以用来存储权限的某种骇客(或脚本)吗?


不必说这些东西,只需选择票选最高的那个,或者您发现最有帮助的一个:)
塞斯(Seth)2014年

Answers:


17

tar代表磁带存档。它所做的只是将文件及其元数据(权限,所有权等)打包成字节流,这些字节流可以存储在磁带机(或文件)中,并在以后还原。压缩是一个完全独立的问题,您曾经不得不通过外部实用程序将输出传递给管道,以便在需要时进行压缩。GNU tar足以添加开关来告诉它通过适当的实用程序作为快捷方式自动过滤输出。

Zip和7z将归档和压缩功能结合在一起,形成了自己的容器格式,并且它们打算将文件打包在DOS / Windows系统上,因此它们不存储UNIX权限和所有权。因此,如果要存储适当备份的权限,则需要坚持使用tar。如果您打算与Windows用户交换文件,则zip或7z很好。zip和zip实际使用的压缩算法可以分别通过uzing gzip和tar与tar一起使用lzma

lzma(aka。* .xz)具有最好的压缩率之一,并且解压缩速度非常快,使其成为当今的首选。但是,压缩确实需要大量的ram和cpu时间。尊者gzip在压缩时速度要快得多,因此如果您不想花费那么多的CPU时间,可以使用它。它还有一个更快的变体,称为lzop。 bzip2由于7z / lzma的压缩率更高,因此在7zip / lzma出现之前就已经在很大程度上替代gzip了,因此仍相当受欢迎,但由于7z / lzma的解压缩速度更快且压缩率更高,因此如今已不受欢迎。该compress实用程序通常命名为* .Z,它很古老,而且早已被人们遗忘。

zip和tar之间的另一个重要区别之一是zip将数据压缩成小块,而压缩tar文件时,则可以一次压缩整个内容。后者提供了更好的压缩率,但是为了在归档文件的末尾提取单个文件,必须对整个文件进行解压缩才能得到。因此,zip格式更适合从大型存档中提取一个或两个文件。7z,并dar允许您选择压缩整个对象(称为“实体”模式)或小的块,以便轻松地逐块提取。


但是,只有TAR支持元数据吗?还是gzip / bzip2现在还支持元数据
Kaz Wolfe 2014年

@pacificfils,压缩实用程序仅压缩单个文件,没有元数据。
psusi 2014年

可以将一个tar压缩为文件夹,然后将其放入zip并保留权限吗?
卡兹·沃尔夫

@pacificfils,是的,但这有点愚蠢,因为您将放弃zip的优势以及更好的压缩率gzip
psusi 2014年

@pacificfils tar cfp将保留权限。tar文件未压缩,因此zip(7-zip),gzip2,gzip,lzo等都将很好地压缩tar文件(通常,压缩文件的tar不太可能是可压缩的)。
Elliott Frisch 2014年

9

这些算法的细节不在此处讨论1,因为它们并不是Linux特有的,更不用说Ubuntu了。但是,您将在这里找到一些不错的信息。

tar正如您所说,现在到了,tar而且从来都不是压缩程序。相反,它是一个存档器;它的主要目的是从大量小文件中提取一个大文件。从历史上看,这是为了便于存储在磁带机上,因此得名:Tape ARchive。

今天,使用的主要原因tar是减少系统上的文件数量。Unix文件系统上的每个文件都占用一个索引节点,您拥有的文件越多,可用的索引节点就越少,并且当索引节点用尽时,您将无法再创建新文件。简而言之,与单个tar存档中的相同文件相比,与数千个文件存储相同数量的数据将占用更多的硬盘驱动器。

为了说明这一点,由于在注释中存在争议,因此在我的68G /分区上,我具有以下总数的inode和已使用的inode(请记住,inode的数量取决于文件系统类型和分区的大小):

Inode count:              393216
Free inodes:              171421

如果我现在继续尝试创建比索引节点更多的文件:

$ touch {1..171422}
touch: cannot touch ‘171388’: No space left on device
touch: cannot touch ‘171389’: No space left on device
touch: cannot touch ‘171390’: No space left on device
touch: cannot touch ‘171391’: No space left on device
touch: cannot touch ‘171392’: No space left on device
touch: cannot touch ‘171393’: No space left on device
touch: cannot touch ‘171394’: No space left on device
touch: cannot touch ‘171395’: No space left on device
touch: cannot touch ‘171396’: No space left on device
touch: cannot touch ‘171397’: No space left on device

没有空间?但是我有很多空间:

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       5,8G  4,3G  1,2G  79% /

如您在上面看到的,创建数十万个空文件会迅速耗尽我的inode,而我无法再创建新的inode。如果我要tar这些,我将能够再次开始创建文件。

减少文件数量也极大地加快了文件系统I / O的速度,尤其是在NFS挂载的文件系统上。当项目完成时,我总是将我的旧工作目录放在tar目录中,因为我拥有的文件越少,类似的程序find就可以工作。

关于超级用户,有一个很好的答案,它会涉及更多细节,但是除了上述内容之外,tar今天仍然流行的其他基本原因是:

  1. 效率:tar像这样通过压缩程序进行管道传输gzip效率更高,因为它避免了中间文件的创建。

  2. tar 带有各种功能,经过悠久的历史设计,使其对* nix备份特别有用(例如权限,文件所有权,将数据直接传递到STDOUT以及通过SSH链接的功能... )

  3. 惯性。我们习惯了tar。可以肯定的是,它可能会在您可能会使用的任何* nix上提供,这使得它非常便于移植,并且易于处理源代码tarball。


1这是绝对正确的,与我对它们的解释还不够了解的事实无关:)


3
我的计算机过去曾经有超过10,000,000个文件,这并不是太疯狂。tar坦率地说,我绝不习惯“减少文件数量”,因为大多数文件系统都不在乎,而且由于tar不支持对文件的轻松随机访问,因此它并不是最佳选择。相反,主要用途(对我和我认为对大多数人而言)是以一种简单的方式与其他人共享文件(例如源代码)。
nneonneo

@nneonneo您是否曾经不得不在单个目录中处理数百万个文件?我有并且相信我,这并不容易。除了明显的问题外ARG_MAX,这还可以使您以任何方式处理文件变得麻烦,并且实际上可以建立一个(糟糕的)设置网络,在该网络中文件存储在中央服务器中并与NFS共享。至于减少文件总数,您需要的文件数量要多于注意的数量,但是在多用户设置中,inode的数量确实会受到限制。
terdon 2014年

@nneonneo举一个更具体的例子,tune2fs -l在存放我的$ HOME的分区上,告诉我我有19,300,352个inode。我将无法创建更多文件。如您所说,10 ^ 6并不疯狂,即使在更高的范围内也是如此。根据你在做什么,你可以有需要的方式不止于此。
terdon 2014年

@nneonneo请参阅更新的答案,以获取有关如何轻松用尽inode的真实示例。
terdon

我的服务器使用的索引节点刚好超过一百万,这仅仅是因为我有一吨的电子邮件(许多高流量的邮件列表可以追溯到几年前)并以Maildir格式存储。我不知道要用掉1900万个i节点,您可能会做什么。您必须每天24小时,每秒超过7个月的时间创建一个新文件。
psusi 2014年

4

有两个不同但相关的任务。将文件树(包括文件名,目录结构,文件系统权限,所有权和任何其他元数据)打包到字节流中称为 归档。删除字节流中的冗余以产生较小的字节流称为压缩

在Unix上,这两个操作是分开的,每个操作都有不同的工具。在大多数其他平台(当前和历史平台)上,组合工具可以同时执行归档和压缩。

(gzip和其他模仿gzip界面的程序通常可以选择将原始文件名存储在压缩输出中,但这与CRC或其他检测损坏的检查一起是它们可以存储的唯一元数据。)

将压缩与归档分开是有优势的。归档是特定于平台的(需要保留的文件系统元数据相差很大),但是实现是简单明了的,很大程度上受I / O限制,并且随时间变化不大。压缩是与平台无关的,但是实现受到CPU的限制,并且算法也在不断改进,以利用现代硬件可以解决此问题的资源的增加。

最受欢迎的Unix归档器是tar,尽管还有其他诸如cpioar。(Debian软件包是ar归档文件,而 cpio通常用于初始ramdisk。)从(最旧到最年轻) tar已经或经常与compress(.Z),gzip(。gz), (。bz2)bzip2xz(.xz)等压缩工具结合使用。,而不是同时出现从最坏到最佳压缩的情况。

进行tar存档和压缩是不同的步骤:压缩器对tar文件格式一无所知。这意味着从压缩的tar存档中提取单个文件需要解压缩所有先前的文件。这通常称为“固定”存档。

同样,由于tar是一种“流”格式(需要在管道中使用),因此tar归档文件中没有全局索引,列出tar归档文件的内容与提取它一样昂贵。

相比之下,Zip和RAR和7-zip(现代Windows平台上最流行的存档器)通常分别压缩每个文件,并且对元数据进行轻度压缩(如果有的话)。这样可以便宜地列出档案中的文件并提取单个文件,但是这意味着不能利用同一档案中多个文件之间的冗余来增加压缩率。虽然通常压缩已压缩的文件不会进一步减小文件的大小,但有时您可能会在zip文件中看到一个zip文件:第一个zip会将很多小文件变成一个大文件(可能禁用了压缩),第二个然后压缩成一个单独的实体。

在不同的平台和理念之间存在交叉授粉:gzip本质上zip是没有其存档程序的压缩机,而xz本质上7-zip是没有其存档程序的压缩机。

还有其他专用压缩机。对PPM变体及其后继ZPAQ进行了优化,以实现最大压缩,而无需考虑资源消耗。它们可以轻松消耗尽可能多的CPU和RAM,而解压缩与压缩一样费力(相比之下,最广泛使用的压缩工具是非 对称的:解压缩比压缩便宜)。

在另一端lzo,,snappyLZ4是“轻型”压缩机,其设计旨在以压缩为代价实现最高速度和最低资源消耗。它们在文件系统和其他对象存储中被广泛使用,但在独立工具中则较少使用。


那你该选哪一个呢?

归档:

由于您使用的是Ubuntu,因此没有真正的理由使用除tar归档以外的任何方式,除非您试图制作易于在其他地方读取的文件。

zip普遍性是很难击败的,但是它不是以Unix为中心的,并且不会保留文件系统的权限和所有权信息,而且其固有的压缩能力已过时。7-zip和RAR(和ZPAQ)具有更现代的压缩功能,但同样不适合归档Unix文件系统(尽管没有什么可以阻止您将它们用作压缩程序了)。RAR也是专有的。

压缩:

为了获得最大的压缩效果,您可以看一下基准,例如http://mattmahoney.net/dc/text.html上的大量基准。这应该使您更好地了解所涉及的权衡。

但是,您可能不希望最大压缩率。太贵了。

xz是现代Unix系统上最流行的通用压缩工具。我相信7-zip也可以读取xz文件,因为它们密切相关。

最后:如果您要为短期存储以外的任何内容归档数据,则应选择开源且最好是开源的东西,以最大程度地减少以后的麻烦。


1

lzo, gz, b2, lzma (.lzma2 =.xz)是“流”压缩器:他们压缩不知道且不关心文件,目录和元数据(如权限)的流。您必须使用诸如tar之类的存档器将所有数据捆绑到一个字节流(一个tar文件)中,并使用压缩器对其进行压缩。如果它是您关心的单个文件的数据,则也可以将该文件单独馈送到这些压缩器之一。

Tar, cpio and pax是存档器:它们获取一堆文件和目录,并将数据和元数据编码在一个文件中。tar是最受欢迎和最兼容的,尽管这三个之间的技术优点很小,以至于在黎明时分就发生过宗教战争。

7z和zip是压缩程序和压缩程序:然后存储所有数据和元数据并进行压缩。但是,对于AFAICT,它们都没有保存Unix权限。

Zip使用与gzip相同的算法,称为DEFLATE。7z使用lzma算法

要从tar.gz等读取单个文件,您将需要解压缩整个gz流,直到暴露出足够多的tar文件,以便将其提取。Zip允许您分别压缩和提取每个文件。7z可以有任何一种行为。

压缩比和速度:gzip和lzo具有非常非常快的压缩和解压缩速度,但压缩比却很低。压缩也不需要太多内存。gzip比lzo慢一点,压缩率也好一点。

它是如此之快,因此可以更快地从磁盘读取gz或lzo压缩文件并对其进行解压缩,而不是直接从磁盘读取未压缩的文件。

LZMA(xz)对常规数据提供了出色的压缩,但是压缩和解压缩需要很长时间,并且要压缩大量内存。

bz2曾经是首选的高压缩算法,但由于它比lzma慢并且压缩和解压缩都需要更长的时间,因此不受欢迎。但是对于某些类型的数据(dna序列,具有相同字节的超大运行量的文件等),bzip2可以击败其他一切。举例来说,我曾经不得不压缩一个4GB的文件,大小为1,而b2将i压缩为几十个kb,而如果我没记错的话,lzma则压缩了大约十个MB。


实际上,lzma的解压缩速度非常快。
psusi 2014年

0

对于特别大的文件,可以使用rzip。它首先查看900 MB大块中的冗余数据,对它们进行编码,然后将数据移交给bzip2(不是真的,但是使用相同的算法)。

影响?速度远远超过xzlzma或者bzip2,在我的经验它的压缩比竞争对手那的lzma。但是,这是RAM猪。

http://en.wikipedia.org/wiki/Rzip

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.