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