写点什么

数仓无损压缩算法:gzip 算法

发布于: 刚刚

​​摘要:一种无损的压缩数据格式,是一个在类 Unix 上的一种文件解压缩软件。

 

本文分享自华为云社区《GaussDB(DWS) gzip算法简介》,作者:hw0086。

【算法原理】


gzip 是一种无损压缩算法,其基础为 Deflate,Deflate 是 LZ77 与哈弗曼编码的一个组合体。它的基本原理是:对于要压缩的文件,首先使用 LZ77 算法的一个变种进行压缩,对得到的结果再使用哈夫曼编码(根据情况,使用静态哈弗曼编码或动态哈夫曼编码)的方法进行压缩。Deflate 最初作为 LZW 以及其他受专利保护的数据压缩算法的替代版本而设计的,当时那些专利限制了 compress 以及其它一些流行的归档工具的应用。

【压缩核心 Deflate】

1.LZ77 算法

        

LZ77 的核心思路是如果一个串中有两个重复的串中有两个重复的串,那么只需要知道后面的串与前面串重复的长度和后面串起始字符与前面串起始字符相对于起始位置的距离。

       

例如:ABCCDEFABCCDEGH 通过 LZ77 算法可压缩为 ABCCDEF(7,6)GH,其中 7 表示重复串起始字符 A 到前面串起始字符的距离,5 表示重复部分的长度(ABCCDE)。

       

LZ77 采用滑动窗口(sliding-windowcompression)来实现这个算法,扫描头从串的头部开始扫描,在扫描头的前面有一个长度未 N 的滑动窗口。若发现扫描头处的串和窗口里的最长匹配串是相同的,则用(两个串之间的距离, 串长度)来代替后一个重复的串,同时还需要添加一个表示是真实串还是替换后的串的字节在前面以方便解压。实际过程中滑动窗口的大小固定,匹配的串也有最小长度的限制,以方便(标识+串之间距离+串长度)之和所占用的字节是固定的。

2.哈夫曼编码

        

哈夫曼编码是数据结构课程中一种常见的算法。哈夫曼编码使用变长编码表对源符号进行编码,变长编码表通过一种评估来源符号出现概率的方法得到,出现概率较高的字母使用较短的编码,反之出现概率低的使用较长的编码,这样使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。通过构造 Huffman Tree 的方式给字符重新编码,避免一个叶子的路径是另一个叶子路径的前缀,以保证出现频率越高的字符占用的字节越少。

        

例如:给英文单字“FO R G E T”进行哈弗曼编码,将每个英文字母出现频率由小排到大,如下图。



​每个字母与都代表一个终端节点(叶子节点),比较留个字母中每个字母出现的频率,将最小的两个字母相加合成一个新的节点。如下图。组成哈弗曼树。



将上图给定的哈弗曼树的所有左链接设为 0.右链接设为 1,从根节点到叶子节点一次记录每个字母的编码,所得每个字母的编码表如下图。



【文件格式】



  • 10 字节的头,包含幻数、版本号以及时间戳

  • 可选的扩展头,如原文件名

  • 文件体,包括 DEFLATE 压缩的数据

  • 8 字节的尾注,包括 CRC-32 校验和以及未压缩的原始数据长度


通常 gzip 仅用来压缩单个文件,再对多个文件的压缩归档通常会将这些文件合并成一个 tar 文件,再使用 gzip 对 tar 文件进行压缩,最后生成.tar.gz 或者.tgz 文件,即“tar 压缩包”或者“tarball”。

【应用】


  • -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


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 2
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
数仓无损压缩算法:gzip算法