4 个版本

使用旧的 Rust 2015

0.1.3 2020年5月24日
0.1.2 2020年5月24日
0.1.1 2017年6月3日
0.1.0 2016年10月8日

#1163 in 数据库接口


用于 tree-buf

GPL-3.0 许可证

43KB
784

这是 Facebook 的 Gorilla 数据库内存格式的 Rust 不完整实现,如 Gorilla: A Fast, Scalable, In-Memory Time Series Database 所述。

示例

示例在 examples/csv_to_packed.rs 中。运行如下

cargo run --release --example csv_to_packed

这将读取文件 examples/test_data.csv 并在内存中压缩它。这不是一个很有趣的文件,但用你喜欢的数据替换它将显示压缩和解压缩读取之间的压缩比和速度差异。

模块中也有测试代码示例。

实现细节

Gorilla 论文省略了一些细节

  • 压缩双精度数时,有效位数的数量存储在6位中,最大值为63。需要注意的是,实际上只需要63个值:1到64。我通过存储 M - 1 来解决这个问题,其中 M 是有效位数(代码中的 [MEANING64])。 另一种实现 通过存储 M & 63 并在读取时解决它来存储。两种解决方案都很好。前者优化了读取速度,后者优化了写入速度。
  • 最高前导零的位数存储在5位中,最大值为31个前导零。尽管如此,有效位数可以有前导零,所以我们只是使用31,如果它是31或更高的话。(代码中的 [LEADING31]
  • 前一个XOR的领数字。我们是存储那个数字还是XOR本身?如果是前者,当我们重用它时,窗口将保持不变;如果不是,当新数据到来时,它可能会缩小。不确定最佳解决方案。(代码中的 [XORORLEADING]
  • IntStream写入一个数字加上一个偏差,使得结果数字始终为非负数。这使得编码和解码速度快,无需分支或依赖于数字的硬件表示。最初版本不够智能,解码时间大约是两倍。

进一步工作

  • 衡量和优化性能
  • 解决《实现细节》中的悬而未决的问题
  • 实现论文的其余部分
  • 调查Rust的Write和Read特性和手动编写的特性能否替换
  • 更好的命名
    • Stream现在可以指比特流和压缩流
    • Writer可以指代Writer特性和它的实现或“压缩器”

无运行时依赖