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

问题描述 投票:184回答:5

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

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

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

gzip tar 7zip bzip2 xz
5个回答
255
投票

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

tar cf - paths-to-archive | pigz > archive.tar.gz

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

tar cf - paths-to-archive | pigz -9 -p 32 > archive.tar.gz

272
投票

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

例如使用:

tar -c --use-compress-program=pigz -f tar.file dir_to_zip 

93
投票

常用方法

tar计划的选项:

-I, --use-compress-program PROG
      filter through PROG (must accept -d)

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

最受欢迎的多线程归档器是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

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

$ tar cf - paths_to_archive | pbzip2 > OUTPUT_FILE.tar.gz
$ tar cf - paths_to_archive | pigz > OUTPUT_FILE.tar.gz

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

p7zip

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

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

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

$ tar -I 7zhelper.sh -cf OUTPUT_FILE.tar.7z paths_to_archive
$ tar -I 7zhelper.sh -xf OUTPUT_FILE.tar.7z

xz

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

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

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

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

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

用替换重新编译

如果从源代码构建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

11
投票

您可以将快捷方式-I用于tar的--use-compress-program开关,并在多个内核上调用pbzip2进行bzip2压缩:

tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/

0
投票

如果您希望在文件名和压缩选项方面具有更大的灵活性,可以使用:

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec \
tar -P --transform='s@/my/path/@@g' -cf - {} + | \
pigz -9 -p 4 > myarchive.tar.gz

Step 1: find

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec

此命令将查找要归档的文件,在本例中为/my/path/*.sql/my/path/*.log。添加尽可能多的-o -name "pattern"你想要的。

-exec将使用find的结果执行下一个命令:tar

Step 2: tar

tar -P --transform='s@/my/path/@@g' -cf - {} +

--transform是一个简单的字符串替换参数。它将从存档中删除文件的路径,以便tarball的根在提取时成为当前目录。请注意,您不能使用-C选项来更改目录,因为您将失去find的好处:将包含该目录的所有文件。

-P告诉tar使用绝对路径,因此它不会触发警告“从成员名称中删除前导'/'”。无论如何,领先'/'将由--transform删除。

-cf -告诉tar使用我们稍后将指定的tarball名称

{} +使用find之前发现的每个文件

Step 3: pigz

pigz -9 -p 4

根据需要使用尽可能多的参数。在这种情况下,-9是压缩级别,-p 4是专用于压缩的核心数。如果在负载很重的Web服务器上运行它,您可能不希望使用所有可用的核心。

Step 4: archive name

> myarchive.tar.gz

最后。

© www.soinside.com 2019 - 2024. All rights reserved.