跳转至

这里我们将解释一下子压缩过程,他被用于 Leveled 和 universal 风格压缩。

目标

自压缩的目标是通过分片到多个线程,来加速一个压缩任务。

何时?

当下面的条件中的一个成立的时候会发生:

  • L0 -> Lo, o>0。
    • 为什么? L0->Lo 不能跟另一个 L0->Lo 并行运行,因此分片是惟一的加速方法。
  • universal 压缩,除了 L0 -> L0。
  • 人工 Leveled 压缩,L0 -> Lo, o>0
    • 为什么?用户触发的人工压缩通常不能并行,所以可以通过分片来处理

注意:自压缩过程如果没有从目标 Level Lo 的文件需要合并,就不会启动。参考 Compaction::ShouldFormSubcompactions 了解更多

如何?

目前一个基于启发式的实现,运行良好。启发式可以再许多方向上进行改善。

选择基于输入文件/层的自然边界 的 边界。

  • L0 的文件的第一个和最后一个 key
  • 非 0 和 非最后 一层 的第一个和最后一个 key
  • 最后一层的每个 SST 文件的第一个 key

使用 Versions::ApproximateSize 来估算每个边界内的数据大小。

合并边界来估计空的和小于平均的范围。

  • 找到每个范围的平均大小
  • 从开始处,贪婪合并连续的范围,直到他们的大小超过平均值。