这里我们将解释一下子压缩过程,他被用于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 来估算每个边界内的数据大小。
合并边界来估计空的和小于平均的范围。
- 找到每个范围的平均大小
- 从开始处,贪婪合并连续的范围,直到他们的大小超过平均值。