主要观点、关键信息和重要细节总结:
- Intro:作者写自己实现的 Kafka Broker 时,深入研究 Kafka 记录批次压缩,发现对压缩知识了解甚少,于是决定深入探究几种压缩算法。
Primer on Compression:
- 压缩是用更少比特表示数据以节省存储和传输时间,有无损和有损两种类型,文中主要讨论无损压缩。常见压缩技术有行程长度编码(RLE)、Lempel-Ziv(LZ)、Huffman 编码等。不同压缩方案优化的三个指标是压缩比、压缩速度和解压速度。
GZIP:
- GZIP 是世界上最著名的压缩格式之一,其核心是 DEFLATE 算法,结合了 LZ77 和 Huffman 编码。DEFLATE 有三种块类型:未压缩型(Type 0)、固定 Huffman 码型(Type 1)、动态 Huffman 码型(Type 2)。文中详细解释了 DEFLATE 算法中如何使用 Huffman 编码表示数据以及在压缩块中如何处理字面量和回溯引用。Golang 中 Deflate 的实现中,用
token
表示字面量和回溯引用,使用哈希函数构建哈希表,根据不同压缩级别进行匹配搜索等。
- GZIP 是世界上最著名的压缩格式之一,其核心是 DEFLATE 算法,结合了 LZ77 和 Huffman 编码。DEFLATE 有三种块类型:未压缩型(Type 0)、固定 Huffman 码型(Type 1)、动态 Huffman 码型(Type 2)。文中详细解释了 DEFLATE 算法中如何使用 Huffman 编码表示数据以及在压缩块中如何处理字面量和回溯引用。Golang 中 Deflate 的实现中,用
Snappy:
- Snappy 是 LZ 家族的后代,注重速度,压缩比通常在 1.5 - 1.7 倍(纯文本)和 2 - 4 倍(HTML),比 zlib 最快模式快一个数量级。其格式中每个块由可变长度编码的长度和一系列块组成,不同块类型有不同的编码方式,如字面量块和复制块。Golang 中 Snappy 的实现通过哈希 4 字节来查找匹配,一次处理一个块,找到匹配后进行编码。Snappy 与 DEFLATE 在搜索先前回溯引用方面的区别在于匹配长度和维护的历史记录方式。
LZ4:
- LZ4 与 Snappy 相似,都是 LZ 家族的成员,在压缩和解压缩方面都更快,压缩比与 Snappy 相似。LZ4 帧格式包括魔数、帧描述符、数据块、校验和等部分,数据块的压缩方式是将字面量和匹配块结合,用
token
表示长度,偏移量用 2 字节小端序表示。Golang 中 LZ4 的压缩过程依赖哈希表查找回溯引用,与 Snappy 有相似之处但也有一些差异。LZ4 有 LZ4_HC 变体,可通过调整哈希表链和参数来平衡压缩比和 CPU 时间。
- LZ4 与 Snappy 相似,都是 LZ 家族的成员,在压缩和解压缩方面都更快,压缩比与 Snappy 相似。LZ4 帧格式包括魔数、帧描述符、数据块、校验和等部分,数据块的压缩方式是将字面量和匹配块结合,用
ZSTD:
- ZSTD 是 LZ4 的 successor,由 Yann Collet 开发,压缩比与 Deflate 相似或更好,速度与 LZ4 和 Snappy 相当。它更复杂,基于 LZ 算法,结合了 Huffman 编码、FSE 和一些技巧。FSE 基于算术编码方法,旨在提高计算效率。ZSTD 还具有可训练字典的功能,可从一组文件中训练字典,用于压缩特定类型的数据。
- Conclusion:压缩是一个有趣的领域,AI 模型本质上可看作压缩模型,将大量数据压缩为一组权重。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。