数仓无损压缩算法: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-window compression)来实现这个算法,扫描头从串的头部开始扫描,在扫描头的前面有一个长度未N的滑动窗口。若发现扫描头处的串和窗口里的最长匹配串是相同的,则用(两个串之间的距离, 串长度)来代替后一个重复的串,同时还需要添加一个表示是真实串还是替换后的串的字节在前面以方便解压。实际过程中滑动窗口的大小固定,匹配的串也有最小长度的限制,以方便(标识+串之间距离+串长度)之和所占用的字节是固定的。
2.哈夫曼编码
哈夫曼编码是数据结构课程中一种常见的算法。哈夫曼编码使用变长编码表对源符号进行编码,变长编码表通过一种评估来源符号出现概率的方法得到,出现概率较高的字母使用较短的编码,反之出现概率低的使用较长的编码,这样使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。通过构造Huffman Tree的方式给字符重新编码,避免一个叶子的路径是另一个叶子路径的前缀,以保证出现频率越高的字符占用的字节越少。
例如:给英文单字“F O 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

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
新版Microsoft Defender预览版应用在微软商店出现
微软似乎正在为Windows 10和Windows 11 PC测试一个新的Microsoft Defender Preview应用程序。本周早些时候,Aggiornamenti Lumia发现了这个应用程序,WalkingCat今天跟进,分享了一个商店列表的链接。 这个新的微软卫士预览版应用程序已经可以从Windows10和Windows 11的微软商店下载,但是,用个人微软账户登录暂时无法使用。由于微软还没有正式宣布这个新的应用程序,看起来它仍然仅限于微软员工使用。 该应用程序目前只是以一条信息欢迎用户,其中提到"简单、无缝和个性化的保护,使你和你的家人可以享受安心"。根据商店列表的描述,微软卫士预览版应用不会只关注Windows,因为它将让用户"在包括Windows、苹果和Android在内的各种操作系统中保护你的设备"。 这种跨平台的关注表明,这个新的微软卫士预览版应用程序可能不会取代现有的Windows Security应用程序,该应用程序可以让Windows 10和Windows 11用户管理保护其电脑的应用程序和服务。相反,这个应用程序有可能成为你个人的Windows、iO...
- 下一篇
网络生病了怎么办?看华为云网络测量如何“悬丝诊脉”
摘要:网络领域在IT技术里一直是复杂的,而网络故障发生频率往往较高,对业务影响也比较大。 本文分享自华为云社区《【华为云Stack】【大架光临】第1期:华为云网络测量如何“悬丝诊脉”》,作者:华为云Stack资深架构师 李俊武 。 一、背景: 云计算为数据中心注入新活力,业务通过云化来实现资源快速部署;弹性伸缩和敏捷创新,而网络领域也从原来的交换机、路由器、防火墙等物理网络逐步延伸到包括虚拟交换机、虚拟路由器、虚拟防火墙和应用类网络虚拟设备的虚拟网络。 传统网络设备运维已经形成了配套的标准和工具,比如交换机设备常用的端口收发报文计数、SNMP交换机监控指标、端口镜像/流镜像/ERSAPN镜像、ACL计数、日志信息等。随着网络SDN架构的发展,基于SDN架构的云网络具有智能化的基因,比如网元提供Netconf信息上报接口等。随着云网络的发展以及业务上云的普及,虚拟网络成为云计算开发者、使用者、运维工程师等角色需要深入理解的技术。 图1 云网络的常见流量 二、云计算虚拟网络发展带来的问题和难点 网络领域在IT技术里一直是比较复杂的,而网络故障发生频率往往较高,对业务影响也比较大。传统业务上...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7设置SWAP分区,小内存服务器的救世主