vlambda博客
学习文章列表

并行加速 Linux 压缩与解压

Linux 下压缩或解压一个文件,通常使用 tar.gz 格式,对应的工具为 tar(打包工具) 以及由 -z 参数指定的 gzip(压缩解压工具)。

而默认的 gzip 工具是单线程工作的,在处理大文件时非常慢。

可以通过 -I 参数指定自定义的并行(多进程、多核)压缩解压工具 pigz 来进行加速。

pigz 的官方自我介绍:

A parallel implementation of gzip for modern multi-processor, multi-core machines

使用方法

  • 安装 pigz 工具包(yum 或 apt)
  • 将常规参数中的 -z 去掉,换上 -I
# 压缩
tar -I pigz -cvf package.tar.gz /path/to/file_or_folder
# 解压 (中括号内为可选,用于指定解压缩目标地址)
tar -I pigz -xvf package.tar.gz [-C  /path/to/extracted]

注意事项:

  • 常规的 tar 方法中 czvfxzvf 中前边的 - 可省了,且 fvvf 顺序可调整
  • 此处因为要加入 -I 参数,不能省略 -,且 vf 参数只能是 f 在后( f 紧挨指定的压缩文件路径)

原理解析

tar 通常的用法为:

# 压缩
tar -czvf package.tar.gz /path/to/file_or_folder
# 解压 (中括号内为可选,用于指定解压缩目标地址)
tar -xzvf package.tar.gz [-C  /path/to/extracted]

我们来看一下 tar --help 返回的帮助信息中这几个参数的含义:

  -c, --create                     create a new archive
  -x, --extract, --get             extract files from an archive
  -z, --gzip, --gunzip, --ungzip   filter the archive through gzip
  -f, --file=ARCHIVE               use archive file or device ARCHIVE
  -C, --directory=DIR              change to directory DIR
  -v, --verbose                    verbosely list files processed

以及另外一个我们今天使用的参数:

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

通过以上信息,我们可以知道:

  • -z 的意思是使用 gzip 进行压缩或解压
  • -I 可以自定义你使用的压缩解压工具

网上也有其他一些方案,例如管道组合之类的,不太好记。这里推荐 -I 参数的方法。

测试效果

为了测试出实际效果,我这里找了一个 iso 镜像,对比一下使用 pigz 和普通压缩

  • 首先使用普通压缩
[fosafer@host61 ~]$ du -sh CentOS-6.5-x86_64-bin-DVD1.iso
4.2G CentOS-6.5-x86_64-bin-DVD1.iso
[fosafer@host61 ~]$ time tar zcf CentOS-6.5.tar.gz ./CentOS-6.5-x86_64-bin-DVD1.iso
real 3m32.345s # 时间执行时间 3分32秒
user 3m8.052s
sys 0m14.383s
  • 使用 pigz 并行压缩
[fosafer@host61 ~]$ du -sh CentOS-6.5-x86_64-bin-DVD1.iso
4.2G CentOS-6.5-x86_64-bin-DVD1.iso
[fosafer@host61 ~]$ time tar -I pigz -cf CentOS-6.5-pigz.tar.gz ./CentOS-6.5-x86_64-bin-DVD1.iso
real 0m9.282s # 实际执行时间才 9 秒,比普通压缩快了差不多 20 倍左右
user 4m10.573s
sys 0m11.637s
原文链接:https://liangxinhui.tech/2019/11/13/pigz/