0%

Sprintz

0. background

物联网小bit蓝牙传输压缩。

1. goal

timestamp col_1 col_2
123 56 4
124 57 4
130 55 4

对于上表由多条record组成的时间序列block按照列方向进行压缩,打包成压缩块(pack)。

2. Algorithm

选择这些步骤的原因:

  • forecast:连续样本具有高度相似性
  • run-length:数据没变化的时候极端压缩
  • bit pack:同一block使用相同宽度,利用数据周期相关
  • entropy:提高压缩比

image-20220112152340440

2.1 forecasting

(1)delta 算法

$forecastx = x{i-1}$

例如col_1:$x_1=56,x_2 = 57, x_3 = 55; forecast_x_2=56, forecast_x_3=57$

(2)fast integer regression

$forecast_xi = x{i-1} + \alpha x{i-1} - \alpha x{i-2} + \epsilon_i$

$\alpha $由机器学习算法得到

论文中没有提及fast integer regression的存储和使用,在后续的简介中都是以delta算法为例陈述。

存储

压缩算法不直接存储$x_i$也不存储$forecast_x_i$,而是存储$err_i = x_i-forecast_x_i$

2.2 bit packing

Bit pack 在论文中也是以delta算法为基础介绍的。

sprintz算法以数据块(block)为单位进行压缩。对于每一个数据块而言,上一块数据块的最后一条记录(record),称为“previous value”。

不妨设previous value为:

123 55 4

经过delta算法处理后,得到delta数据块

delta_timestamp delta_col_1 delta_col_2
0 1 0
1 1 0
6 -2 0

由于出现负数,为方便后续进行二进制编码,进行zigzag encoding。即对于正整数,可以把无意义的0去掉,只存储从1开始的”有效”数据,这样就可以压缩数据了。例如,对于正整数1,其补码(当代计算机中实际按补码表示整数)按位展开,即为(00000000 00000000 00000000 00000001)补,显然,我们可以只用一个字节甚至1bit来存储有效数据。(算术左移低位补0;算术右移,若符号位为0,高位补0;若符号位为1,高位补1;

得到

zigzag_timestamp zigzag_col_1 zigzag_col_2
0 2 0
2 2 0
12 3 0

变为二进制表示

bit_timestamp bit_col_1 bit_col_2
0 10 0
10 10 0
1100 10 0
4bit表示 2bit表示 0bit表示

由最后一行得到header

100(十进制表示4) 10(十进制表示2) 0

整理得到压缩块

header 100 10 0
payload1 0 10 0
payload2 10 10 0
payload3 1100 10 0

2.3 entropy coding

对Header跟Payload使用哈夫曼编码。