compress algorithm

因为考虑到了索引的压缩和缓冲的压缩,所以看了下压缩算法

一是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个字节编码

 

编码序列为

48bit头信息+编码序列+异常序列

头信息记录的是:

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的解压时间应较短

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值