因为考虑到了索引的压缩和缓冲的压缩,所以看了下压缩算法
一是lucene的变长字节编码
二是较为新的PForDelta算法
变长字节编码就不说了,提一下PForDelta
1. 将数据按块划分(压缩),这里取的是128(uint8_t取值)
2. 对小于等于128大小的数据块(抑或不足128)进行压缩
压缩过程详解
l 一趟遍历数据找到所有数据的位数统计信息(用多少位可以表示数据,
做直方图统计)
l 取分布的90%点-位数,则90%的数据都可以用少于等于该位数(bit_of_num)编码
l 二趟遍历找到第一个异常下标和所有异常的位置
l 遍历编码数据,如果是奇异点,则编码其位置(差分值)
每bit_of_num位作为一个数据的编码范围(表示一个数据)高位置低位(翻转)串接起来
例如 1 的二进制码为0000 0001,如果用6位表示,则 00 0001
使用一个字节B的低六位表示: 00 -> 10 0000高两个字节为下一数据所有
而48的二进制码为0011 0000,如果用6位表示11 0000
将48的高两位补齐B的高两位11,则B的编码值变为1110 0000
则B的值为224
l 编码奇异点,4个字节编码
编码序列为
4个8bit头信息+编码序列+异常序列
头信息记录的是:
1.数据块的长度
2.数据的bit数
3.异常的数量
4.第一个异常的下标
总长
4+(length*bit_of_num+32*num_of_exception+7)/8
4为头信息
bit_of_num是正常需要编码位数
length是块大小,比如128
num_of_exception是奇异值的个数
问题是:
1. 多趟扫描数据
统计分布
取得奇异点
做了个简单的实验主要是为了了解PForDelta编码过程
实验准备
51.2 MB数据
实验步骤
1. 将数据差分
2. 将差分序列压缩
3. 解压
4. 校验结果是否正确
差分+PForDelta
compress 13447023
compressed_length is: 5541300 bytes.
compressed_time is: 0.39 seconds.
decompressed_length is: 53788092 bytes.
decompressed_time is: 0.344 seconds.
compress ratio is:10.3021%
PForDelta
compress 13447023
compressed_length is: 39469869 bytes.
compressed_time is: 2.016 seconds.
decompressed_length is: 53788092 bytes.
decompressed_time is: 2.031 seconds.
compress ratio is:73.3803%
差分+变长编码
compress 13447023
compressed_length is: 13448045 bytes.
compressed_time is: 0.047 seconds.
decompressed_length is: 53788092 bytes.
decompressed_time is: 0.062 seconds.
compress ratio is:25.0019%
实验结果与预期不符?
主要体现的是:PForDelta的解压时间应较短