跳到内容

reresearch中的垃圾收集

1.GC的需求

  • 删除文档并不是真正地删除它们。它在全局文档表中将文档标记为已删除,以使其快速。
  • 这意味着基本上内部的数字id不再分配给文档。当我们遍历索引时,我们检查是否删除。
  • 因此,属于这个文档id的所有反向索引项都是垃圾。
  • 我们不想在删除文档时显式地删除它们,因为这会使这个操作非常长,并且取决于文档的长度。
  • 最重要的是,更新一个文档基本上就是删除它,然后用一个新的增量内部id再次添加它。我们不做任何区别,只对索引进行追加,因此ids保持增量,并且更新速度很快。

所有这些都意味着,如果我们有大量的更新和删除,那么很大一部分倒置索引将变成垃圾——这不仅会减慢速度,还会消耗不必要的内存。

因此,我们想优化索引。但是我们也不想打扰到正常的操作。这意味着优化或垃圾收集应该是一个非侵入性的后台进程。它只需要在足够长的时间内比删除速度快,这样我们就不会创建比收集更多的垃圾。

2.垃圾收集单项索引

一个单项反向索引由一个“块”数组组成,每个块包含一个经过编码的记录列表——文档id delta加上其他数据,这取决于索引编码方案。当其中一些记录引用已删除的文档时,这称为垃圾。

算法非常简单:

  1. 为每个块创建一个读写器
  2. 逐个读取每个块的记录
  3. 如果没有无效记录,则不做任何操作
  4. 一旦我们发现了垃圾记录,我们就会提前通知读者而不是作者。
  5. 一旦我们发现了至少一条垃圾记录,我们就将下一条记录编码给写入器,重新计算增量。

伪代码:

foreachindex_block作为读者new_reader作家new_write垃圾0读者结束()记录读者decode_next()如果记录is_valid()如果垃圾! =0: #记录作家S尖上有一个新计算的delta作家write_record记录其他的作家推进记录长度其他的垃圾+=记录长度

2.1数值索引的垃圾收集

数字索引现在是一棵具有特殊编码(docId delta,value)的反向索引树。这意味着可以对它们应用相同的算法,只遍历树中的每个反向索引对象。

3.叉GC

关于FORK GC的信息可以在这里找到博客

从v1.6开始,FORK GC是默认的GC策略,并且被证明在清理索引和不降低查询和索引性能方面非常有效(即使对于写操作非常密集的用例)

Baidu