默认情况下,使用并行bzip2和gzip的最佳方法是什么?


41

尽管许多计算机具有多个内核,但Bzip2和gzip仅使用一个内核。但是,有些程序(例如lbzip2,pbzip2和Pigz)使用所有可用的内核,并承诺与bzip2和gzip兼容。

那么默认情况下使用这些程序的最佳方法是什么,以便tar cfa file.tar.bz2 directory使用lbzip2 / pbzip2而不是bzip2?当然,我不想破坏任何东西。


2
出于所有人的好奇:并行gzip / bzip真的比串行速度快吗?我会想到,硬盘的写入速度和其他限制因素更多。
con-f-use

@ con-f-use除非理论上没有SSD,否则随着存档总大小的增加,它可能会更快。
Marco Ceppi

1
在具有16 cpus的系统上,从gzip切换到pigz可以将时间缩短至tar 1.2TB并通过网络进行传输,并且可以将测试结果从18小时的备份和14小时的测试转换为4小时的备份和2小时的测试。存在许多潜在的瓶颈,磁盘速度,网络速度,处理能力,但是在这种情况下,这绝对是cpu绑定比IO绑定更多。这是一个高端系统,您的结果可能会有所不同。
没关系

Answers:


32

您可以将bzip2,bunzip2和bzcat符号链接到lbzip2,并将gzip,gunzip,gzcat和zcat符号链接到pigz:

sudo apt-get install lbzip2 pigz
cd /usr/local/bin
ln -s /usr/bin/lbzip2 bzip2
ln -s /usr/bin/lbzip2 bunzip2
ln -s /usr/bin/lbzip2 bzcat
ln -s /usr/bin/pigz gzip
ln -s /usr/bin/pigz gunzip
ln -s /usr/bin/pigz gzcat
ln -s /usr/bin/pigz zcat

我选择了lbzip2而不是pbzip2,因为/usr/share/doc/lbzip2/README.gz看起来比/usr/share/doc/pbzip2/README.gz更“小”。另外,tar手册还讨论了lbzip2

编辑:

精确的穿山甲中包含的pigz-2.1.6拒绝解压缩后缀未知的文件(例如initramfs-*。img)。这在Quantal附带的Pigz-2.2.4中已修复。因此,您可能要等到Quantal,手动安装Quantal软件包,或者暂时不要链接gunzip / gzcat / zcat。


7
这很有效,因为/ usr / local / bin /在大多数人的$ PATH中位于/ bin /之前。如果某人直接调用/ bin / gunzip或某人的$ PATH中首先包含/ bin,则他们将不使用Pigz。为了使它们也能正常工作,您可以使用dpk-divert并对所有二进制文件执行类似的操作,sudo dpkg-divert --divert /bin/gunzip.orig --rename /bin/gunzip; sudo ln -s /usr/bin/pigz /bin/gunzip但是Pigz可能不是100%与所有gzip标志兼容,因此请小心。
Mark McKinstry

31

symlink的想法真的很好。
另一个可行的解决方案是使用别名tar

alias tar='tar --use-compress-program=pbzip2'

或分别

alias tar='tar --use-compress-program=pigz'

它创建了另一种默认值。


额外的好处:如果您想保留原始功能(出于某种原因),则可以使用“ partar”之类的别名。.遗憾的是,perl实现采用了“ ptar”
jena

13

symlink答案确实是不正确的。对于整个系统,它将用Pigz(或pbzip2)替换默认的gzip(或bzip2)。尽管并行实现与单个进程版本非常相似,但命令行选项中的细微差别可能会破坏依赖那些差异的核心系统进程。

“ --use-compress-program”选项是一个更好的选择。第二个选项(非常类似于别名)是设置GNU tar支持的TAR_OPTIONS环境变量:

$ export TAR_OPTIONS =“-use-compress-program = pbzip2”
$ tar czf myfile.tar.bz2 mysubdir /

6
自2011年以来,我一直在使用符号链接,没有发现任何损坏(除了编辑中提到的情况)。如果没有发现并报告这种细微的差异,我们将永远被非并行版本所困扰。如果您使用TAR_OPTIONS =“-use-compress-program = pbzip2”,则似乎无法区分bzip2和gzip。
Elmicha

这对我不起作用。
德里克·珀金斯

3

一种引人入胜的选择是默认情况下重新编译tar以使用多线程。从此stackoverflow答案复制

替换后重新编译

如果从源代码构建tar,则可以使用参数重新编译

--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip

使用以下选项重新编译tar后,您可以检查tar帮助的输出:

$ tar --help | grep "lbzip2\|plzip\|pigz"
  -j, --bzip2                filter the archive through lbzip2
      --lzip                 filter the archive through plzip
  -z, --gzip, --gunzip, --ungzip   filter the archive through pigz

-2

在您的〜/ .bash_aliases中使用:

alias gzip="pigz"
alias gunzip="unpigz"

1
仅当直接在Shell的命令行上调用gzip(或gunzip)程序时,这才有效。其他程序(如tar)将不受此影响。
Christian Hudon 2015年
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.