深入浅出lz4压缩算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅出lz4压缩算法相关的知识,希望对你有一定的参考价值。

参考技术A

lz4是目前综合来看效率最高的压缩算法,更加侧重压缩解压速度,压缩比并不是第一。在当前的安卓和苹果操作系统中,内存压缩技术就使用的是lz4算法,及时压缩手机内存以带来更多的内存空间。本质上是时间换空间。

lz4压缩算法其实很简单,举个压缩的栗子

其中两个括号内的便代表的是压缩时检测到的重复项,(5,4) 代表向前5个byte,匹配到的内容长度有4,即"bcde"是一个重复。当然也可以说"cde"是个重复项,但是根据算法实现的输入流扫描顺序,我们取到的是第一个匹配到的,并且长度最长的作为匹配。

压缩后的数据是下面的格式

其他情况也可能有连续的匹配:

Literals 指没有重复、首次出现的字节流,即不可压缩的部分
Match 指重复项,可以压缩的部分
Token 记录literal长度,match长度。作为解压时候memcpy的参数

可以想到,如果重复项越多或者越长,压缩率就会越高。上述例子中"bcde"在压缩后,用(5,4)表示,即从4个bytes压缩成了3个bytes来表示,其中offset 2bytes, match length 1byte,能节省1个byte。

大致流程,压缩过程以至少4个bytes为扫描窗口查找匹配,每次移动1byte进行扫描,遇到重复的就进行压缩。
由于offset用2bytes表示,只能查找到到2^16(64kb)距离的匹配,对于压缩4Kb的内核页,只需要用到12位。
扫描的步长1byte是可以调整的,即对应LZ4_compress_fast机制,步长变长可以提高压缩解压速度,减少压缩率。

我们来看下 apple的lz4实现

压缩理解了其实解压也很简单

根据解压前的数据流,取出token内的length,literals直接复制到输出,即memcpy(src,dst,length)
遇到match,在从前面已经拷贝的literals复制到后面即可

以上是关于深入浅出lz4压缩算法的主要内容,如果未能解决你的问题,请参考以下文章

LZ4压缩算法简介

LZ4压缩算法简介

PostgreSQL 14中TOAST的新压缩算法LZ4,它有多快?

几种压缩算法简单测试

Linux六大压缩算法横评:Ubuntu 19.10最终选择LZ4

压缩算法性能对比