压缩篇:XOR & DFCM

"常用的时序数据编码"

Posted by wangyapu on March 27, 2020 | 浏览:

压缩篇:XOR & DFCM

前言

该篇主要介绍另一种数值压缩算法:异或 XOR,它与 delta-of-delta 算法有相似之处,但是大部分场景下数值基本都是无规律可寻的,所以差值的思想并不适用。本文主要介绍基于 XOR 的一种高效的压缩算法 DFCM。

XOR & DFCM 参考论文:

http://www.vldb.org/pvldb/vol8/p1816-teller.pdf https://userweb.cs.txstate.edu/~mb92/papers/dcc06.pdf

XOR 运算

摘取论文中的 XOR 数据:

Decimal Hexadecimal XOR with previous
12 0x4028000000000000 -
24 0x4038000000000000 0x0001000000000000
15 0x402e000000000000 0x0001600000000000
12 0x4028000000000000 0x0006000000000000
35 0x4041800000000000 0x0069800000000000
Decimal Hexadecimal XOR with previous
15.5 0x402f000000000000 -
14.0625 0x402c200000000000 0x0003200000000000
3.25 0x400a000000000000 0x0026200000000000
8.625 0x4021400000000000 0x002b400000000000
13.1 0x400a333333333333 0x00b7333333333333

附 Java 浮点数转换十六进制

System.out.println(Long.toHexString(Double.doubleToLongBits(15.5)));

System.out.println(Double.longBitsToDouble(Long.parseLong("402F000000000000", 16)));

DFCM

XOR 运算后的数值可以选择多种通用的压缩算法进行压缩,例如 Gzip、7zip、rar 等。论文中给出了各算法的压缩效率和压缩率的对比:

压缩效率

压缩率

可见 DFCM 算法在压缩效率和压缩率上的表现都是非常优秀的。下面介绍下 DFCM 的实现原理。

通过 XOR 的运算结果可以看出都存在前导 0 和后导 0,尤其后导 0 的个数更多,DFCM 将前导 0 和后导 0 一并进行了压缩。DFCM 将 XOR 的值拆分为三部分:

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

DFCM 采用前一个 XOR 值对当前 XOR 值进行编码,具体编码规则如下:

  • 第一个数值不用于压缩,用于作为参考值。
  • 控制位计算规则:
    • 如果 XOR 值为 0,存储 1bit:0
    • 如果 XOR 值不为 0,控制位第一个 bit 存为 1,后续数据的计算方式如下:
      • 如果当前 XOR 的 Meaningful bits 落在了前一个 XOR的 Meaningful bits 范围内(即当前 XOR 的 Leading Zeros 长度大于等于前一个 XOR 的 Leading Zeros 长度并且当前 XOR 的 Trailing Zeros 长度大于等于前一个 XOR 的 Trailing Zeros 长度),则控制位的第二个bit为 1,接下来存 XOR 非零的数值。

      • 如果当前 XOR 的 Meaningful bits 不在前一个 XOR 的 Meaningful bits 范围内,则控制位的第二个 bit 为 0,后续存放:
        1. 5bits: Leading bits 个数
        2. 6bits: Meaningful bits 个数
        3. XOR 非零的数值

DFCM 压缩后效果:

Decimal XOR Compress
15.5 - 不压缩
14.0625 0x0003200000000000 13bits + 6bits
3.25 0x0026200000000000 13bits + 10bits
8.625 0x002b400000000000 2bits + 10bits

压缩前:64 * 4 = 256bits

压缩后:64 + 19 + 23 + 12 = 118bits

总结

在时序数据场景,一小段时间范围内数值变化范围很小。XOR & DFCM 压缩算法在时序数据场景可以达到非常高的压缩比,在无序的数据中也可以取得很好的效果,同时系统的存储成本也会大幅度降低。