摘要:一种无损的压缩数据格式,是一个在类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

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

数仓无损压缩算法:gzip算法相关推荐

  1. 无损压缩算法专题——RLE算法实现

    一.前言 本文是基于我的另一篇博客<无损压缩算法专题--无损压缩算法介绍>的基础上来实现的,RLE算法最简单的理解就是用(重复数,数据值)这样一个标记来代替待压缩数据中的连续重复的数据,以 ...

  2. 常用无损压缩算法原理简析

    无损压缩算法原理 压缩一般分为两个步骤,建模和编码.一个完美的模型可以描述数据流是如何产生的,相当于一个python类里面的generator.只需要这个generator就可以产生所有数据,从而大大 ...

  3. Hadoop(HDFS+MapReduce+Hive+数仓基础概念)学习笔记(自用)

    文章目录 修改虚拟机IP 复制网卡的配置 Vi编辑器的常用命令 实操部分 复制网卡的配置 Hadoop集群初体验 20.secondarynameNode如何辅助管理FSImage与Edits文件 ⭐ ...

  4. 大数据开发超高频面试题!大厂面试必看!包含Hadoop、zookeeper、Hive、flume、kafka、Hbase、flink、spark、数仓等

    大数据开发面试题 包含Hadoop.zookeeper.Hive.flume.kafka.Hbase.flink.spark.数仓等高频面试题. 数据来自原博主爬虫获取! 文章目录 大数据开发面试题 ...

  5. 无损压缩算法专题——miniLZO

    目录 一.miniLZO介绍 二.miniLZO的使用 三.VS2013下文件压缩和解压测试 四.STM32F103ZET6平台下的测试 五.总结 六.参考资料 一.miniLZO介绍 miniLZO ...

  6. 视频压缩算法有哪些php,常用的无损压缩算法有哪些

    常用的无损压缩算法有:1.LZ77算法,该算法是很多其他无损压缩算法的基础:2.LZR算法,是旨在提升LZ77的一个算法:3.LZSS算法,该算法目标是成为LZ77的一个线性时间替换算法:4.DEFL ...

  7. 大数据面试题--数仓

    目录 数据仓库理论 数据分层 E T L 星形模型与雪花模型的区别? 维度建模(dimensional modeling): 数据仓库项目最重要或需要注意的是什么,以及如何处理? 关系建模与维度建模 ...

  8. 大数据-案例-离线数仓-在线教育:MySQL(业务数据)-ETL(Sqoop)->Hive数仓【ODS层-数据清洗->DW层(DWD-统计分析->DWS)】-导出(Sqoop)->MySQL->可视化

    一.商业BI系统概述 商业智能系统,通常简称为商业智能系统,是商业智能软件的简称,是为提高企业经营绩效而采用的一系列方法.技术和软件的总和.通常被理解为将企业中的现有数据转换为知识并帮助企业做出明智的 ...

  9. 从数仓到数据中台,谈技术选型最优解

    本文根据颜博老师在[Deeplus直播第218期]线上分享演讲内容整理而成. 颜博 马蜂窝数仓研发总监 现任马蜂窝数据仓库团队负责人,曾供职于京东.IBM.亚信等公司. 数据行业老兵一名,历经传统数据 ...

最新文章

  1. php 使用netstat -an,netstat -an 查看端口
  2. Linux下挂载与解除挂载U盘
  3. Node.js- sublime搭建node的编译环境
  4. [转]Oracle 执行计划(Explain Plan) 说明
  5. Windows 64位下为wampserver或phpstudy安装Redis扩展
  6. 循环节模板 NOJ427Number Sequence
  7. OpenCASCADE绘制测试线束:拓扑命令之复杂拓扑
  8. MyBatis入门HelloWorld,注解实现
  9. python求字符串的所有子集_打印一字符串的所有子集 | 学步园
  10. 购物车中 商品的选中状态之后的一些业务逻辑操作
  11. 内向的性格对我人生的影响
  12. 汉威电子持续发力智慧城市产业链
  13. 代价函数的作用(2)--机器学习
  14. 湖南省计算机二级官网2020,湖南2020年3月计算机二级考试报名时间安排
  15. redis常用命令总结(慎入)
  16. cannt connect to db!_分贝db以及在语音的用途
  17. OpenCV 文字绘制cv::putText详解
  18. 设置和取消Excel限制保护的两种方法
  19. php控制梯形图,plc控制交通灯梯形图设计实例论文
  20. 大漠长空孤烟直,吾自翔天遨竟游!

热门文章

  1. (14)css—伪类选择器
  2. VSCode自定义代码片段10—— 数组的响应式方法
  3. es6 模块的语法概述
  4. RTP协议解析和H264码流提取
  5. oracle 磁盘响应慢,磁盘故障引起的系统变慢定位
  6. linux防止文件被复制,技术|如何在 Linux 系统中防止文件和目录被意外的删除或修改...
  7. python中range和arange的区别_Python3中range , arange 和linspace 的异同
  8. linux网站宝塔无法访问ipv6,centos7宝塔面板服务器开启纯IPV6访问
  9. html字体代码大全_HTML基础笔记(一)
  10. 动画函数优化,为任意元素添加任意多个属性