openGemini 全新浮点数压缩算法 MLF

31 阅读2分钟

前言

  • 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

数据模型

  1. 50-60 之间,小数点后最多 2 位的随机数
  2. 0-1 之间,小数点后最多 6 位的随机数
  3. 大于 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)的浮点数,该算法不适用