开源数据压缩工具-gzip
2013-05-24 10:02:14 阿炯

Gzip是若干种文件压缩程序的简称,通常指GNU计划的实现,此处的gzip代表GNU zip。也经常用来表示gzip这种文件格式。软件的作者是Jean-loup Gailly和Mark Adler。

gzip的算法基础是DEFLATE


gzip (GNU zip) is a compression utility designed to be a replacement for compress. Its main advantages over compress are much better compression and freedom from patented algorithms. It has been adopted by the GNU project and is now relatively popular on the Internet. gzip was written by Jean-loup Gailly, and Mark Adler for the decompression code.

gzip produces files with a .gz extension. gunzip can decompress files created by gzip, compress or pack. The detection of the input format is automatic.

文件格式说明
 10字节的头,包含幻数、版本号以及时间戳
 可选的扩展头,如原文件名
 文件体,包括DEFLATE压缩的数据
 8字节的尾注,包括CRC-32校验和以及未压缩的原始数据长度

尽管这种文件格式允许多个这样的数据拼接在一起,在解压时也把它们当作拼接在一起的数据,但是通常gzip仅仅用来压缩单个文件。多个文件的压缩归档通常是首先将这些文件合并成一个tar文件,然后使用gzip进行压缩,最后生成的.tar.gz或者.tgz文件,这就是所谓的“tar压缩包”或者“tarball”。

注意不要将gzip和zip压缩格式混淆。ZIP也使用DEFLATE算法,而且可移植性更好,并且不需要一个外部的归档工具就可以包容多个文件。但是,由于zip对每个文件进行单独压缩而没有利用文件间的冗余信息(固实压缩),所以ZIP的压缩率要稍逊于tar压缩包。

对应的解压程序是gunzip。

在HTTP/1.1协议中允许客户端可以选择要求从服务器下载压缩内容,这个标准本身定义了三种压缩方法:“gzip”(内容用gzip数据流进行封装)、“compress”(内容用compress数据流进行封装)以及“deflate”(内容是原始格式、没有数据头的DEFLATE数据流)。当然前者是目前的主流,很多站点都开启了gzip压缩功能。

命令行选项
 -c,--stdout 将解压缩的内容输出到标准输出,原文件保持不变
 -d,--decompress 解压缩
 -f,--force 强制覆盖旧文件
 -l,--list 列出压缩包内储存的原始文件的信息(如,解压后的名字、压缩率等)
 -n,--no-name 压缩时不保存原始文件的文件名和时间戳,解压缩时不恢复原始文件的文件名和时间戳(此时,解出来的文件,其文件名为压缩包的文件名)
 -N,--name 压缩时保存原始文件的文件名和时间戳,解压缩时恢复原始文件的文件名和时间戳
 -q,--quiet 抑制所有警告信息
 -r,--recursive 递归
 -t,--test 测试压缩文件完整性
 -v,--verbose 冗余模式(即显示每一步的执行内容)
-1、-2、...、-9 压缩率依次增大,速度依次减慢,默认为6


不常见用法

gzip怎么将压缩或解压缩文件到处理其他目录

解决方法:gzip test.txt -c > /freeoa/test.gz,将文件流重定向,解压也是:gunzip /freeoa/test.gz -c > ./test.txt 或 gzip -d /freeoa/test.gz -c > ./test.txt

gzip的man手册中关于此压缩相关的节选

-c --stdout --to-stdout
Write  output on standard output; keep original files unchanged.If there are several input files, the  output  consists  of  a sequence  of  independently compressed members. To obtain better compression, concatenate all input files  before compressing them.

-d --decompress --uncompress
Decompress.

从标准输入接收文件流再进行压缩输出

cat comorig2.txt |gzip -9 >com3.gz
cat comorig2.txt |gzip -9 -c >com4.gz


基于gz并行压缩-pigz

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

pigz(Parallel Implementation of Gzip)可突破多核并发的压缩算法革命与性能跃迁,gzip采用单线程方式,虽然能够完成任务,但在多核处理器环境下,压缩速度和效率未能充分发挥。与传统gzip不同,pigz通过并行算法,充分利用多核处理器,显著提升了压缩速度,同时在保证高效压缩的情况下,压缩文件更小,有效节省存储空间。

pigz 软件是基于 C 语言构建的,并在开发过程中引入了两个核心库:zlib 和 pthread。其中,zlib 是广泛使用的开源数据压缩库,提供高效的压缩与解压缩功能,并支持多种常见的压缩格式;而 pthread 则是用于多线程编程的标准库,提供线程创建、同步和管理等功能,遵循 POSIX(便携式操作系统接口)标准,专为 Linux 系统中的多线程编程设计。这两个库的结合使用,极大提升了 pigz 在处理大数据时的效率,尤其是在并行压缩和解压缩方面展现了显著的性能优势。这为后续开发类似的多线程分析软件提供了宝贵的经验与借鉴,特别是在优化计算密集型任务和提升处理速度方面。

pigz的应用技巧
用户可以通过运行 `pigz -h` 和 `unpigz -h` 命令,查看详细的命令行选项和用法说明,从而掌握更多高级功能,提升数据处理效率。

1.pigz(压缩)
#使用10个线程,压缩当前目录下所有的fq文件
pigz -p 10 *.fq

#使用10个线程,保留原始的fq文件,压缩当前目录下的所有fq文件
pigz -p 10 -k *.fq

#使用10个线程,解压缩当前目录下的所有gz文件,同时保留原始的gz文件
pigz -d -p 10 -k *gz

#查看压缩比
pigz -l *gz

#压缩目录
tar --use-compress-program="pigz -k " -cf S5.tar.gz S5

#查看目录的压缩比
pigz -l S5.tar.gz

2.unpigz(解压缩)
#可以一次性解压缩所有的gz文件
unpigz -p 10 *gz

#使用10个线程,保留原始gz文件,进行解压缩
unpigz -p 10 -k S4.fastq.gz

#解压缩tar.gz目录
unpigz -p 10 S5.tar.gz

最新版本:1.6
添加 "--keep" (-k) 参数用于不删除输入文件
修复了 pack 格式的解压问题
使用优化编译后的错误覆盖问题修复
zgrep 的处理多数字上下文参数的问题修复
zmore 行为更像 more

最新版本:1.11
gzip 的上一个版本是 2018 发布的 1.10,时隔两年半后的2021年9月上旬,它终于迎来了更新——Gzip 1.11。不过在这两年多的时间里,Gzip 似乎也没带来令人眼前一亮的变化,主要是针对 IBM Z 设备的优化。gzip 1.11 的主要变化是合并了由 IBM 贡献的补丁——为 Gzip 提供对 IBM Z 的良好支持。Gzip 1.11 具有用于压缩和解压缩的 IBM Z 硬件加速 DEFLATE 实现。IBM 表示“压缩和解压缩性能比当前的 gzip 快几个数量级,比率与级别 1 相当”。除了针对 IBM Z 的优化,自 v1.10 以来的变化包括构建升级、文档升级、改进测试覆盖率和其他维护工作。更多详情查看发行公告


官方主页:http://www.gzip.org/

项目主页:http://www.gnu.org/software/gzip/