利用多核进行tar + gzip/bzip压缩/解压缩

use*_*764 198 gzip 7zip tar xz bzip2

我通常压缩使用tar zcvf和解压缩使用tar zxvf(由于习惯使用gzip).

我最近得到了一个具有超线程的四核CPU,所以我有8个逻辑核心,我注意到许多核心在压缩/解压缩期间未被使用.

有什么办法可以利用未使用的核心来加快速度吗?

Jen*_*Jen 295

您还可以使用tar标志"--use-compress-program ="告诉tar要使用的压缩程序.

例如使用:

tar -c --use-compress-program=pigz -f tar.file dir_to_zip 
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常棒的知识小块,值得更多的赞成.我不知道这个选项是否存在,多年来我已经多次阅读过该手册页. (21认同)
  • 我更喜欢`tar - dir_to_zip | pv | pigz> tar.file` pv帮我估计,你可以跳过它.但写作和记忆仍然更容易. (7认同)
  • 2020 年,“zstd”是实现此目的最快的工具。压缩和解压缩时速度明显加快。使用 `tar -cf --use-compress-program=zstdmt` 通过多线程执行此操作。 (4认同)
  • 不幸的是,通过这样做,pigz的并发功能丢失了.您可以通过执行该命令并监视每个核心上的负载来亲眼看到. (2认同)
  • @ValerioSchiavoni:不是在这里,我在所有 4 个内核(Ubuntu 15.04 'Vivid')上都满载。 (2认同)
  • 这个答案的问题是你没有对pigz参数的任何控制.例如,如何启用`--best`压缩或设置要使用的进程数(`--processes`).这就是为什么我更喜欢@ mark-adler所接受的答案,他在管道上使用了pigz. (2认同)

Mar*_*ler 278

您可以使用pigz而不是gzip,它在多个内核上执行gzip压缩.而不是使用-z选项,你将通过pigz管道:

tar cf - paths-to-archive | pigz > archive.tar.gz
Run Code Online (Sandbox Code Playgroud)

默认情况下,pigz使用可用内核的数量,如果无法查询,则为8.您可以使用-pn询问更多内容,例如-p 32. pigz与gzip具有相同的选项,因此您可以使用-9请求更好的压缩.例如

tar cf - paths-to-archive | pigz -9 -p 32 > archive.tar.gz
Run Code Online (Sandbox Code Playgroud)

  • pigz确实使用多个内核进行减压,但仅对单个内核进行了有限的改进.deflate格式不适合并行解压缩.减压部分必须连续完成.pigz解压缩的其他内核用于读取,写入和计算CRC.另一方面,当压缩时,pigz接近_n_核心的改善因素. (39认同)
  • 这里的连字符是stdout(参见[本页](http://unix.stackexchange.com/questions/41828/what-does-dash-at-the-end-of-a-command-mean)). (7认同)
  • 你如何使用pigz以同样的方式解压缩?或者它只适用于压缩? (3认同)
  • 是.两个方向100%兼容. (3认同)
  • 实际上没有占用CPU时间,所以它没有多大帮助.tar格式只是输入文件的副本,文件之间有标题块. (3认同)
  • 所以据我所知,pigz 生成的文件与 gzip 兼容,对吗?我可以用 pigz 创建的 gzip 解压缩文件吗? (2认同)
  • pigz 可以使用多个内核进行压缩,但是 tar 操作仍然只使用一个内核。有平行的tar吗? (2认同)
  • 如果需要stdout,只需删除tar的-f选项。;-) (2认同)
  • @WilliamTFroggard尖峰可能是由于deflate算法的突发性造成的.收集未压缩的数据,直到可以产生放气块,此时快速生成和发射块. (2认同)

Max*_*lov 103

常用方法

tar程序选项:

-I, --use-compress-program PROG
      filter through PROG (must accept -d)
Run Code Online (Sandbox Code Playgroud)

您可以使用多线程版本的归档程序或压缩程序实用程序.

最受欢迎的多线程归档器是pigz(而不是gzip)和pbzip2(而不是bzip2).例如:

$ tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 paths_to_archive
$ tar --use-compress-program=pigz -cf OUTPUT_FILE.tar.gz paths_to_archive
Run Code Online (Sandbox Code Playgroud)

Archiver必须接受-d.如果替换实用程序没有此参数和/或您需要指定其他参数,则使用管道(如有必要,添加参数):

$ tar cf - paths_to_archive | pbzip2 > OUTPUT_FILE.tar.gz
$ tar cf - paths_to_archive | pigz > OUTPUT_FILE.tar.gz
Run Code Online (Sandbox Code Playgroud)

单线程和多线程的输入和输出是兼容的.您可以使用多线程版本进行压缩,并使用单线程版本进行解压缩,反之亦然.

的p7zip

对于压缩的p7zip,您需要一个小的shell脚本,如下所示:

#!/bin/sh
case $1 in
  -d) 7za -txz -si -so e;;
   *) 7za -txz -si -so a .;;
esac 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

保存为7zhelper.sh.这里的用法示例如下:

$ tar -I 7zhelper.sh -cf OUTPUT_FILE.tar.7z paths_to_archive
$ tar -I 7zhelper.sh -xf OUTPUT_FILE.tar.7z
Run Code Online (Sandbox Code Playgroud)

XZ

关于多线程XZ支持.如果您运行的是XZ Utils的5.2.0或更高版本,则可以通过环境变量XZ_DEFAULTS(例如)设置-T--threads使用适当的值来利用多个内核进行压缩XZ_DEFAULTS="-T 0".

这是5.1.0alpha版本的一个人的片段:

多线程压缩和解压缩尚未实现,因此此选项暂时无效.

但是,对于尚未使用线程进行压缩的文件进行解压缩,这将不起作用.从版本5.2.2的man:

螺纹减压尚未实施.它仅适用于包含块头中具有大小信息的多个块的文件.以多线程模式压缩的所有文件都满足此条件,但即使使用--block-size = size,也不会以单线程模式压缩文件.

用替换重新编译

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

--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip
Run Code Online (Sandbox Code Playgroud)

使用这些选项重新编译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
Run Code Online (Sandbox Code Playgroud)

  • 加1为'xz`选项.这是最简单但有效的方法. (3认同)
  • `export XZ_DEFAULTS="-T 0"` 在调用 `tar` 之前使用选项 `-J` 进行 xz 压缩就像一个魅力。 (3认同)

pan*_*icz 12

您可以使用-Itar的--use-compress-programswitch 的快捷方式,并pbzip2在多个内核上调用bzip2压缩:

tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/
Run Code Online (Sandbox Code Playgroud)