简介
lz4是目前效率最高的压缩算法,更加侧重压缩解压速度,而不是压缩比。LZ4是ElasticSearch数据存储的默认编码(压缩)方式,通过index.codec
来设置。
压缩原理
lz4压缩算法原理比较简单,如下面例子:
输入:abcde_bcdefgh_abcdefghxxxxxxx
输出:abcde_(5,4)fgh_(14,5)fghxxxxxxx
其中两个括号内的便代表的是压缩时检测到的重复项,(5,4) 代表向前5个byte,匹配到的内容长度有4,即"bcde"是一个重复。当然也可以说"cde"是个重复项,但是根据算法实现的输入流扫描顺序,我们取到的是第一个匹配到的,并且长度最长的作为匹配。
压缩格式
Sequence是LZ4最小数据单元,格式如下:
Token(1字节) | Literal length+ 字面序列长度(0~n字节) | 字面序列 | Offset(2字节) | Match length+ 匹配长度(0~n字节) | |
匹配长度(低4位) | 字面序列长度(高4位) |
- token占一字节,其中高四位表示字面序列长度,低四位表示匹配长度。
- 字面序列长度即使字面序列的字符个数;匹配长度即是匹配序列的字符个数
- 因为字面序列长度以及匹配长度都占四个字节,最大为15。如果长度比15大的话,则将剩余的部分存到Literal length+和Match length+中。例如,字面序列长度为375,则Token的高4位为全1(即15),Token的后一个字节为255,再后一个字节为105。
- offset为匹配序列的偏移量。
- 当Token足以存下字面序列长度时,Token后面就是字面序列。当Token足以存下匹配长度时,Offset后面的字节将是EOF或者另外一个sequence。
LZ4算法还有一些特定的规则:
- 被压缩文本的最后5个byte只能用原文表示。
- 最后一次匹配的开始位置到文本末尾不能少于12个byte。
- 如果被压缩文本的长度小于13个byte,那么用原文表示会更节省空间。
举例
压缩过程分为两步
步骤一:计算hashÿ