并行加速 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
方法中czvf
或xzvf
中前边的-
可省了,且fv
或vf
顺序可调整 -
此处因为要加入 -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