这里我们将解释一下子压缩过程,他被用于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 来估算每个边界内的数据大小。

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

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