前言
- openGemini 是华为云开源的时序数据库
- 最近发布了 1.5.0 的版本,推出了全新的浮点数压缩算法 MLF,在此进行一番测试体验
- 算法专利号:CN 119829640
测试场景
使用 Golang 进行测试,浮点数的编码为 IEEE754 标准。
测试环境
- GO 版本:go1.24.10 windows/amd64
- CPU:cpu: Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz
数据模型
- 50-60 之间,小数点后最多 2 位的随机数
- 0-1 之间,小数点后最多 6 位的随机数
- 大于 200,递增的浮点数,没有小数部分,增量在 10-100 之间
测试信息
- 测试 1024 个浮点数(8KB),对比压缩率,压缩性能,解压性能
- 使用 LZ4, Snappy,Zstd 进行对比
- 包版本如下
LZ4: github.com/pierrec/lz4/v4 v4.1.21
Snappy: github.com/golang/snappy v1.0.0
zstd: github.com/DataDog/zstd v1.5.2
测试结果
压缩率
- 计算方式:压缩前数据大小 / 压缩后数据大小
- 可以看到模型 1 和模型 2 MLF 表现最好,模型 3 MLF 比 ZSTD 略低
- Snappy 和 LZ4 无法压缩模型 2 的数据
压缩性能
- 压缩速度 = 原始数据大小 / 压缩时间
- MLF 在高压缩率同时具有较好压缩性能,性价比非常好
- Snappy 和 LZ4 无法压缩模型 2 的数据,这里排除了他们(看起来太异常了)
解压缩性能
- 解压速度 = 解压后数据大小 / 解压时间
- MLF 的解压性能非常好,场景 3 达到恐怖的 5071MB/s,甚至超过了以解压速度著称的 LZ4
- Snappy 和 LZ4 无法压缩模型 2 的数据,这里排除了他们(看起来太异常了)
总结
在这几个测试场景下,MLF 既有较好的压缩率,又同时具备较快的压缩速度和极快解压速度,综合表现非常不错。
原理浅析
- 算法代码 :github.com/openGemini/…
- 核心思想是基于 IEEE754 标准,用更少 bit 位来表示浮点数
- 通过公式 F = floor(f * M * P) / P 做压缩和还原
F: 原始值
f: 压缩后的值
M: 一组浮点数中的最大值 + 1/P
P: pow(10, N), N 为小说点后的小说位数
- 对于小数点后位较多(8 位),或太大(>2^50)的浮点数,该算法不适用