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

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

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

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

我已经知道ZIP是最广泛使用的压缩系统,但是我应该使用它而不是*.Z*.7z.tar.tar.

发布摘要:

  1. 我应该使用*.tar*.Z *.7z*.7z.tar.tar.以获得最佳压缩效果吗?
  2. 如果普通*.tar不压缩,我们为什么要使用它?

编辑:并非所有算法都允许存储Linux权限(从我学到的)。 我可以使用哪种黑客(或脚本)存储权限?

tar代表磁带存档。 它所做的只是将文件及其元数据(权限,所有权等)打包成一个字节流,可以存储在磁带驱动器(或文件)上并在以后恢复。 压缩是一个完全独立的问题,您曾经必须通过外部实用程序来管道输出以进行压缩(如果需要)。 GNU tar非常适合添加开关,告诉它通过适当的实用程序自动过滤输出作为快捷方式。

Zip和7z将归档和压缩结合在一起成为他们自己的容器格式,它们用于在DOS / Windows系统上打包文件,因此它们不存储unix权限和所有权。 因此,如果要存储正确备份的权限,则需要坚持使用tar。 如果您计划与Windows用户交换文件,那么zip或7z是好的。 实际的压缩算法zip和7zip使用可以与tar一起使用,分别通过uzing gziplzma

lzma(aka。* .xz)具有最佳压缩比之一,并且在减压方面非常快,使其成为最近的首选。 但是,它确实需要大量的ram和cpu时间来压缩。 古老的gzip压缩速度要快得多,所以如果你不想花费那么多的cpu时间,可以使用它。 它还有一个更快的变体叫做lzop。 bzip2仍然相当受欢迎,因为它在7zip / lzma出现之前已经基本上取代了gzip一段时间,因为它有更好的压缩比,但是现在已经失宠了,因为7z / lzma在解压缩时速度更快并且压缩比更好。 compress实用程序通常命名文件* .Z,很古老而且很久就被遗忘了。

zip和tar之间的另一个重要区别是zip以小块压缩数据,而压缩tar文件时,会立即压缩整个文件。 后者提供了更好的压缩比,但是为了在归档结束时提取单个文件,您必须解压缩整个事件才能实现。 因此,zip格式更适合从大型存档中提取一个或两个文件。 7z和dar允许您选择压缩整个物体(称为“固体”模式)或小块以便于零碎提取。

算法的细节在这里是主题1,因为它们不以任何方式特定于Linux,更不用说Ubuntu了。 但是,你会在这里找到一些不错的信息。

现在开始tar ,就像你说的那样, tar不是,也绝不是压缩程序。 相反,它是一个档案员 ; 它的主要目的是用很多小文件制作一个大文件。 从历史上看,这是为了便于存储在磁带驱动器上,因此得名:Tape ARchive。

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

为了说明,由于这在评论中有争议,在我的68G /分区上,我有以下数量的总和使用的inode(请记住,inode计数取决于文件系统类型和分区的大小):

 Inode count: 393216 Free inodes: 171421 

如果我现在继续尝试创建比我的inode更多的文件:

 $ 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,我再也无法创建新的文件。 如果我要tar这些我将能够再次开始创建文件。

拥有较少的文件也极大地加速了文件系统I / O,特别是在NFS挂载的文件系统上。 当项目完成时,我总是将旧工作目录作为tar,因为我拥有的文件越少, find程序就越快。

超级用户有一个很好的答案 ,更详细,但除了上述,目前仍然流行的其他基本原因是:

  1. 效率:使用tar来管理像gzip这样的压缩程序更有效,因为它避免了中间文件的创建。

  2. tar带有各种各样的铃声和口哨声,这些function在其悠久的历史中得到了设计,使其对* nix备份特别有用(想想权限,文件所有权,将数据直接传输到STDOUT和通过SSH链接的能力…… 。)

  3. 惯性。 我们习惯了tar 。 可以安全地假设它可以在你可能碰巧使用的任何* nix上使用,这使得它非常便携并且对于源代码tarball来说非常方便。


1这绝对是真的,与我不太了解他们解释的事实无关:)

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

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

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

将压缩与归档分离是有好处的。 归档是特定于平台的(需要保留的文件系统元数据差别很大),但实现很简单,主要是I / O绑定,并且随着时间的推移变化很小。 压缩与平台无关,但实现受CPU限制,并且算法不断改进,以利用现代硬件可以为问题带来的增加的资源。

最受欢迎的Unix归档程序是tar ,尽管存在其他如cpioar 。 (Debian软件包是ar档案,而cpio通常用于初始ramdisks。) tar经常或者经常与压缩工具结合使用,例如compress (.Z), gzip (.gz), bzip2 (.bz2)和xz (。 xz),从最古老到最年轻,并非巧合,从最差到最佳压缩。

制作tar存档并压缩它是不同的步骤:压缩器对tar文件格式一无所知。 这意味着从压缩的tar存档中提取单个文件需要解压缩所有前面的文件。 这通常被称为“可靠”存档。

同样,由于tar是一种“流式”格式 – 它在管道中很有用 – 在tar存档中没有全局索引,列出tar存档的内容与提取它一样昂贵。

相比之下,Zip和RAR以及7-zip(现代Windows平台上最受欢迎的存档程序)通常会单独压缩每个文件,并且如果有的话轻轻压缩元数据。 这允许在档案中廉价列出文件并提取单个文件,但意味着不能利用同一档案中的多个文件之间的冗余来增加压缩。 虽然通常压缩已经压缩的文件不会进一步减小文件大小,但有时您可能会在zip文件中看到一个zip文件:第一次压缩将大量小文件转换为一个大文件(可能已禁用压缩),其中第二个压缩然后压缩为单个实体。

不同的平台和哲学之间存在交叉授粉: gzip本质上是zip压缩器,没有它的归档器,而xz基本上是7-zip的压缩器而没有它的归档器。

还有其他专用压缩机。 PPM变体及其后继ZPAQ针对最大压缩进行了优化,而不考虑资源消耗。 他们可以轻松地咀嚼尽可能多的CPU和RAM,而压缩​​就像压缩一样令人费力(相比之下,最广泛使用的压缩工具是不对称的 :解压缩比压缩便宜)。

另一方面, lzosnappyLZ4是“轻型”压缩机,设计用于以压缩为代价实现最大速度和最小资源消耗。 它们广泛用于文件系统和其他对象存储中,但不如独立工具。


那你应该选哪个?

归档:

因为你在Ubuntu上没有真正的理由使用除tar以外的任何东西进行归档,除非你试图制作易于在其他地方阅读的文件。

zip无处不在,但它不是以Unix为中心的,不会保留你的文件系统权限和所有权信息,而且它的烘焙压缩也是过时的。 7-zip和RAR(和ZPAQ)具有更现代的压缩,但同样不适合归档Unix文件系统(尽管没有什么可以阻止你使用它们作为压缩器); RAR也是专有的。

压缩:

要获得最大压缩率,您可以查看基准测试,例如http://mattmahoney.net/dc/text.html上的巨大基准测试。 这可以让您更好地了解所涉及的权衡。

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

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

最后:如果你要为短期存储以外的任何东西存档数据,你应该选择一些开源的,最好是广泛的,以减少后来的麻烦。

lzo, gz, b2, lzma (.lzma2 =.xz)是“流”压缩器:它们压缩一个不知道的并且不关心文件,目录和元数据(如权限)的byes流。 您必须使用像tar这样的归档程序将所有数据捆绑到字节流(tar文件)中并使用压缩器压缩它。 如果它是您关心的单个文件的数据 ,您也可以将该文件单独提供给其中一个压缩器。

Tar, cpio and pax是归档者:它们采用一堆文件和目录,并将数据和元数据编码在一个文件中。 焦油是最受欢迎和最兼容的,尽管三者之间的技术优点足够小,以至于在黎明时分就有关于它的宗教战争。

7z和zip是压缩器和arcihvers:然后存储所有数据和元数据并压缩它。 但是AFAICT,它们都没有保存unix权限。

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

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

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

它是如此之快,从磁盘读取gz或lzo压缩文件并在运行中解压缩而不是直接从磁盘读取未压缩文件可以更快。

LZMA(xz)对一般数据提供了出色的压缩,但压缩和解压缩需要很长时间,同时需要占用大量内存才能进行压缩。

bz2曾经是高压缩算法的选择,但由于它比lzma慢并且压缩和解压缩需要更长时间而失宠。 然而,对于某些类型的数据(dna序列,具有相同字节的非常大的运行的文件等),bzip2可以击败所有其他手。 举个例子,我曾经不得不压缩一个1GB的4GB文件,而b2将i减少到几十kb,而如果我没记错的话,lzma需要10个MB。

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

影响? 比xzlzmabzip2快得多,根据我的经验,它的压缩比可与lzma媲美。 不过,这是一个RAM猪。

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