gzip算法简介

gzip是一种基于Deflate算法的无损压缩格式,该算法结合了LZ77滑动窗口压缩和哈弗曼编码。LZ77通过查找重复串并用距离和长度表示来压缩数据,而哈弗曼编码则根据字符出现频率分配不同长度的编码,进一步压缩。gzip文件包含头信息、可选扩展头、压缩数据和尾注,常用于单个文件压缩,而在归档时通常与tar一起使用。Kafka生产者可以通过配置启用gzip压缩。
摘要由CSDN通过智能技术生成

【算法原理】

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

 用 CPU 时间去换磁盘空间或网络 I/O 传输量,希望以较小的 CPU 开销带来更少的磁盘占用或更少的网络 I/O 传输

【压缩核心Deflate】

  1.LZ77算法

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

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

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

 2.哈夫曼编码

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

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

符号FORGET
使用频率234457

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

2.png

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

符号FORGET
使用频率234457
编码0000011001010111

【文件格式】

1.png

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

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

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

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

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

【应用】

  Kafka 生产者压缩算法

 Properties props = new Properties();
 props.put("bootstrap.servers", "localhost:9092");
 props.put("acks", "all");
 props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
 props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
 // 开启 GZIP 压缩
 props.put("compression.type", "gzip");
 
 Producer<String, String> producer = new KafkaProducer<>(props);

        

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小野猪佩奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值