常用有2种实现方式:
方式1:merge方式
- 采用多分片的方式,在内存中建一个小分片,当内存使用达到一定量时,把索引刷到磁盘上
- 根据索引的大小,针对量级差异较小的做数据merge , merge函数
- 需要注意的点:
- 预先训练模型,在内存中和刷磁盘上的模型一致。
- 实时训练模型,内存中使用flat模式,在刷磁盘和归并时,训练模型,这种不同的块中的模型不同,不具有可对比性,需要上层在重新计算距离。
方式2:
- 预先训练模型
- 针对倒排采用预分配空间的方式实现。
- 优点: 建库和搜索更实时,而且没有归并开销,没有训练开销。
- 缺点:对faiss索引修改较大,有一定的内存开销。
- 为了实现数据持久化,可以考虑放到共享内存中,达到一定大小再落到磁盘上。
- 预分空间的实现方式,在原有倒排中保存的是偏移信息,指向实际数据,实际内存的分片采用大块分配,方便管理避免小块内存影响性能(考虑性能和内存浪费情况)。