Beringei高性能时间序列内存数据库原理

本文介绍了Beringei数据库在处理时间序列数据时使用的时间戳和数值压缩算法。通过存储时间戳差值Delta和Delta的差值D,实现了较高的压缩比。数值压缩部分探讨了采用XOR运算后的DFCM无损压缩算法,其在压缩率和速度上优于gzip。通过对XOR值的Leading Zeros, Meaningful Bits和Trailing Zeros进行划分,实现了数据的高效压缩。" 132329642,19673933,Java编程实现十进制到十六进制转换,"['Java', '算法', '数据转换']
摘要由CSDN通过智能技术生成

时间戳压缩算法

 

1. 首先普通的时间戳如下:
2017年3月330000   1488481200
2017年3月330102   1488481262
2017年3月330202   1488481322
2017年3月330302   1488481382

秒级别的时间戳用long类型存储需要占用8bytes。 如果直接存储以上数据需要32个bytes(256 bits).

2. 最简单的优化自然是存储差值 Delta = T(n)-T(n-1) , 这个时候需要引入一个起始时间戳和Delta阈值,比如:起始时间为3:00:00,阈值为2个小时。以下为阀值之内的位点数:
时间戳unix格式Delta
2017年3月3日 3:00:0014884812000
2017年3月3日 3:01:02148848126262
2017年3月3日 3:02:02148848132260
2017年3月3日 3:03:02148848138260

**每个Delta数值的范围从long.MAX缩小到(0~7200)用13个bit就可以存储。因此存储以上数据需要103bits(64+ 13*3 ) **

3. 再进一步,如果存储差值的差值呢delta-of-delta(本文中用D表示)? 我们来看一下效果:
时间戳unix格式DeltaDelta of Delta
2017年3月3日 3:00:00148848120000
2017年3月3日 3:01:0214884812626262
2017年3月3日 3:02:02148848132260-2
2017年3月3日 3:03:021488481382600

 

 

 

数值的范围变得很小了,并且可以进行压缩,根据以下压缩算法

// '0' = delta of delta did not change
// '10' followed by a value length of 7
// '110' followed by a value length of 9
// '1110' followed by a value length of 12
// '1111' followed by a value length of 32
D 范围标识位D数值位数bits总位数bits
00(1bits)01
[-63,64]10(2bits)79
[-255,256]110(3bits)912
[-2047,2048]1110(4bits)1216
大于20481111(4bits)3236
  • 起始时间戳需要64bits,
  • “2017年3月3日 03:01:02”的D值为62,所以标识位是10,7个数值位,总共9个bits.
  • "2017年3月3日 03:03:02"的D值为0, 标识位0,共需要1个bit

采用压缩算法后只需要64+9+9+1=73个bits存储。

时间戳DeltaDelta of Delta压缩后位数
2017年3月3日 3:00:00///
2017年3月3日 3:01:0262629
2017年3月3日 3:02:0260-29
2017年3月3日 3:03:026001

结论:4个时间戳(32bytes),通过delta,再通过delta-of-delta算法,从32个bytes(256 bits),到103bits,再到73bits,整体的压缩比为:3.5;

 

 

数值压缩算法:

看完了时间戳的压缩,我们再来看一下数值的压缩。类似于时间戳Delta, 数值采用的是异或而不是差值。

可以看这里的转换工具

整数Double 精度十六进制
120x4028000000000000
240x4038000000000000
150x402E000000000000
120x4028000000000000
350x4041800000000000

浮点数Double 精度十六进制
15.50x402F000000000000
14.06250x402C200000000000
3.250x400A000000000000
8.6250x4021400000000000

以浮点数为例采用XOR运算后:

浮点数Double 精度十六进制XOR
15.50x402F000000000000 
14.06250x402C2000000000000x0003200000000000
3.250x400A0000000000000x0026200000000000
8.6250x40214000000000000x002b400000000000

XOR后的数值压缩有众多算法可以选择,比如gzip, 7zip等等。

“Fast Lossless Compression of Scientific Floating-Point Data”这篇论文提出了DFCM压缩算法。并且从压缩率,压缩/解压效率方面与一些通用压缩算法进行了评测,如下:

 

 

 

相比gzip,DFCM的压缩速度和压缩率都要更胜一筹。

参考浮点数无损压缩算法DFCM:

 

 

XOR的值可以按照leading zero, meaningful bits, trailing zeros 划分。

  • Leading Zeros: 就是XOR后非零数值前面零的个数
  • Trailing Zeros: 就是XOR后非零数值后面零的个数
  • Meaningful Bits: 中间非零的个数

 

Snip20170306_1

划分后,对DFCM简化,预测算子采用前一个XOR的值,编码规则如下:

  • 第一个值不压缩
  • XOR后的数据计算控制位,如下:
    • 如果XOR是0, 存储一个bit 0。
    • 如果XOR不是0,控制位第一个bit设置1,第二个bit以及随后的数据按照以下方式计算:
    • meaningful bits落在了前一个XOR的meaningful bits区域内,控制位的第二个bit为1,接下来是XOR数值.

Snip20170306_5

  • 否则控制位的第二个bit为0 .并且接下来存放:
    • 5 bits: Leading bits 个数
    • 6 bits: Meaningful bits 个数
    • 随后放置数值

Snip20170306_4

数据由原来的256bits压缩到117bits

浮点数压缩后XOR值
15.5无压缩/
14.062513bits(头部控制位)+5bits(实际数值)0x0003200000000000
3.2513bits(头部控制位)+10bits(实际数值)0x0026200000000000
8.6252bits(头部控制位)+10bits(实际数值)0x002b400000000000

image

 

参考:

https://yq.aliyun.com/articles/69354?spm=5176.8278999.602941.2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值