我通常使用tar zcvf压缩,使用tar zxvf解压(由于习惯使用gzip)。
我最近买了一个带有超线程的四核CPU,所以我有8个逻辑内核,我注意到许多内核在压缩/解压期间没有使用。
有什么方法可以利用未使用的内核使它更快吗?
我通常使用tar zcvf压缩,使用tar zxvf解压(由于习惯使用gzip)。
我最近买了一个带有超线程的四核CPU,所以我有8个逻辑内核,我注意到许多内核在压缩/解压期间没有使用。
有什么方法可以利用未使用的内核使它更快吗?
您可以使用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
你也可以使用tar标志"——use-compress-program="来告诉tar使用什么压缩程序。
例如:
tar -c --use-compress-program=pigz -f tar.file dir_to_zip
你可以对tar的——use-compress-program开关使用快捷键-I,并在多核上调用pbzip2进行bzip2压缩:
tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/
常见的方法
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
归档程序必须接受-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或更高版本,您可以通过将-T或——threads设置为环境变量XZ_DEFAULTS(例如XZ_DEFAULTS="-T 0")的适当值来利用多个内核进行压缩。
这是5.1.0alpha版本的人类片段:
多线程压缩和解压缩还没有实现,所以 选择权暂时无效。
然而,这将不适用于未解压的文件 已启用线程压缩。从man版本5.2.2:
线程解压缩还没有实现。它只会起作用 在文件中包含多个大小信息的块 块头。所有在多线程模式下压缩的文件都符合这个要求 条件,但是在单线程模式下压缩的文件不会 ——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
如果你想在文件名和压缩选项上有更多的灵活性,你可以使用:
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
第一步:寻找
查找/my/path/ -type f -name "*。Sql " -o -name "*.log" -exec
这个命令将查找您想要归档的文件,在本例中为/my/path/*。/my/path/*.log。添加任意数量的-o -name“pattern”。
-exec将使用find: tar的结果执行下一个命令
第二步:焦油
tar - p——transform='s@/my/path/@@g' -cf - {} +
——transform是一个简单的字符串替换参数。它将从存档中剥离文件的路径,以便在提取时tarball的根目录成为当前目录。注意,你不能使用-C选项来更改目录,因为你将失去find的好处:目录下的所有文件将被包括在内。
-P告诉tar使用绝对路径,所以它不会触发警告“从成员名中移除前导' /'”。'/'的前导被——transform删除。
-cf -告诉tar使用我们稍后指定的tarball名称
{} +使用之前找到的所有文件
第三步:猪
猪 -9 -P 4
使用尽可能多的参数。 在本例中,-9是压缩级别,- 4是专用于压缩的内核数。 如果你在一个重载的web服务器上运行这个程序,你可能不想使用所有可用的内核。
步骤4:存档名称
> myarchive.tar.gz
最后。
您可能需要考虑的一个相对较新的(解)压缩工具是zstandard。它在利用备用内核方面做得很好,并且在压缩比和(解)压缩时间方面做了一些很好的权衡。它还可以根据您的压缩比需求进行高度调整。