并行Gzip-Pigz

2020-07-13 02:30:18

有时,我们希望将一个或多个文件压缩为一个压缩文件或解压缩一个压缩文件。使用gzip、zip或7zip等工具分别创建或解压缩.gz、.zip和.7z文件是非常常见的。然而,Linux上的这些工具都没有在压缩和解压缩过程中使用多核和多线程。当文件数量较多或文件大小较大时,使用单线程进行压缩和解压缩将花费大量时间。

Pigz是gzip和zip的并行实现之一。使用Pigz可以极大地节省我们花在压缩和解压缩上的时间。在这篇博客文章中,我想简要讨论一下如何使用Pigz。

博客文章中的Pigz用法主要针对Ubuntu系统。但是,它在其他Linux操作系统上的用法应该几乎相同。

$Pigz--help用法:Pigz[选项][文件.]。将就地压缩文件,并添加后缀';.gz';。如果未指定文件,则将标准输入压缩为标准输出。选项:-0到-9,-11压缩级别(级别11,zopfli,要慢得多)--快速,--分别是最佳压缩级别1和9-b,--block size mmm将压缩块大小设置为mmmK(默认128K)-c,--stdout将所有处理过的输出写入stdout(Won';t delete)-d,--解压缩压缩的输入-f,--强制重写,压缩.gz,链接,并到终端-F--首先进行迭代,然后进行-11-h的块分割,--help显示帮助屏幕并退出-i,--独立压缩块进行损坏恢复-i,--迭代n次-11优化的迭代次数-J,--maxSplits n-11-k的最大分割块数,--Keep不删除原始数据块。--zip压缩为PKWare zip(.zip)单条目格式-l,--列出压缩输入的内容-L,--License显示Pigz许可证并退出-m,--no-time不存储或恢复mod time-M,-time存储或恢复mod time-n,-no-name不存储或恢复文件名或mod time-N,-name存储或恢复文件名和mod time-O-oneblock不拆分成更小的块。--进程n允许最多n个压缩线程(默认为在线处理器的数量,如果未知,则为8)-q,--Quiet不打印任何消息,即使出错-r,--递归处理所有子目录的内容-R,--rsynCable输入-确定rsync-S的块位置,--后缀.sss使用后缀.sss而不是.gz(用于压缩)-t,--测试压缩输入的完整性-v,--Verbose提供更详细的输出-V--version显示Pigz-Y的版本--同步强制输出文件写入永久存储-z,--zlib压缩为zlib(.zz)而不是gzip格式--"之后的所有参数;--";被视为文件。

#compress#始终使用-k保存原始文件$Pigz-k-p8 image.png#解压缩$Pigz-dk-p8 image.gz。

然而,vanilla Pigz在将多个文件压缩成一个文件和自定义输出文件路径方面并不是很友好。我们将需要依赖于tar,这是一种归档工具。

使用PIPE|,我们可以首先将多个文件或目录存档为.tar文件,然后使用Pigz压缩以进一步生成.tar.gz文件。

#compress$tar-cf-data/index.json|Pigz-k-p8>;datet.tar.gz#解压缩(不幸的是两个步骤)$Pigz-k-p8 Datet.tar.gz#将文件解压缩到另一个目录$mkdir-p new_Dataset$tar-XF Dataset.tar-C new_Datet.tar

或者,tar已经在其界面中集成了自定义压缩器,这使得命令看起来更清晰。

#compress$tar--use-compress-program=";Pigz-k-p8";-cf datet.tar.gz data/index.json#将文件解压缩到另一个目录$mkdir-p new_dataSet#解压缩$tar--use-compress-program=";pigz-dk-p8";-xf datet.tar.gz-C new_DataSet