结构体 faiss::OnDiskInvertedLists
-
struct OnDiskInvertedLists : public faiss::InvertedLists
倒排列表的磁盘存储。
数据存储在内存映射的内存块中(基址指针ptr,大小为totsize)。 每个列表是一个内存范围,其中包含(对象列表),其中包含
uint8_t codes[capacity * code_size]
后面是 idx_t ids[capacity]
在每个数组中,使用 size <= capacity 的前几个元素,其余元素未初始化。
通过以下方式支持添加和调整大小
将列表的容量向上舍入为 2 的幂
维护按大小排序的空闲槽列表。
根据需要调整内存映射块的大小。
如果所有列表的大小 == capacity 并且没有可用的槽,则OnDiskInvertedLists是紧凑的。
添加到 invlists 的速度很慢。 对于增量添加,最好使用默认的ArrayInvertedLists对象并使用 merge_from 将其转换为 OnDisk。
当已知将访问一组列表时,调用 prefetch_lists 很有用,它会启动一组线程来并行读取列表。
公共类型
-
using List = OnDiskOneList
-
enum subset_type_t
值
-
enumerator SUBSET_TYPE_ID_RANGE
-
enumerator SUBSET_TYPE_ID_MOD
-
enumerator SUBSET_TYPE_ELEMENT_RANGE
-
enumerator SUBSET_TYPE_INVLIST_FRACTION
-
enumerator SUBSET_TYPE_INVLIST
-
enumerator SUBSET_TYPE_ID_RANGE
公共函数
-
OnDiskInvertedLists(size_t nlist, size_t code_size, const char *filename)
是将倒排列表映射为只读
-
virtual size_t list_size(size_t list_no) const override
获取列表的大小
-
virtual const uint8_t *get_codes(size_t list_no) const override
获取倒排列表的代码必须由 release_codes 释放
- 返回值:
codes 大小 list_size * code_size
-
virtual const idx_t *get_ids(size_t list_no) const override
获取倒排列表的 id 必须由 release_ids 释放
- 返回值:
ids 大小 list_size
-
virtual size_t add_entries(size_t list_no, size_t n_entry, const idx_t *ids, const uint8_t *code) override
-
virtual void update_entries(size_t list_no, size_t offset, size_t n_entry, const idx_t *ids, const uint8_t *code) override
-
virtual void resize(size_t list_no, size_t new_size) override
-
size_t merge_from_multiple(const InvertedLists **ils, int n_il, bool shift_ids = false, bool verbose = false)
-
size_t merge_from_1(const InvertedLists *il, bool verbose = false)
与针对单个倒排表的 merge_from 相同
-
void crop_invlists(size_t l0, size_t l1)
将倒排列表限制为 l0:l1,而不接触内存映射区域
-
virtual void prefetch_lists(const idx_t *list_nos, int nlist) const override
准备以下列表(默认不执行任何操作),列表可以是 -1,因此使用有符号长整型
-
~OnDiskInvertedLists() override
-
void do_mmap()
-
void update_totsize(size_t new_totsize)
-
void resize_locked(size_t list_no, size_t new_size)
-
size_t allocate_slot(size_t capacity)
-
void free_slot(size_t offset, size_t capacity)
-
void set_all_lists_sizes(const size_t *sizes)
覆盖所有列表大小并创建一个打包存储
-
OnDiskInvertedLists()
-
virtual void release_codes(size_t list_no, const uint8_t *codes) const
释放get_codes返回的代码 (默认实现是nop)
-
virtual void release_ids(size_t list_no, const idx_t *ids) const
释放get_ids返回的id
-
virtual idx_t get_single_id(size_t list_no, size_t offset) const
- 返回值:
反向列表中的单个id
-
virtual const uint8_t *get_single_code(size_t list_no, size_t offset) const
- 返回值:
反向列表中的单个代码 (应该用release_codes释放)
-
virtual bool is_empty(size_t list_no, void *inverted_list_context = nullptr) const
检查列表是否为空
-
virtual InvertedListsIterator *get_iterator(size_t list_no, void *inverted_list_context = nullptr) const
获取使用use_iterator的列表的可迭代对象
-
virtual size_t add_entry(size_t list_no, idx_t theid, const uint8_t *code, void *inverted_list_context = nullptr)
向反向列表添加一个条目
-
virtual void update_entry(size_t list_no, size_t offset, idx_t id, const uint8_t *code)
-
virtual void reset()
-
void merge_from(InvertedLists *oivf, size_t add_id)
从oivf移动所有条目 (输出时为空)
-
size_t copy_subset_to(InvertedLists &other, subset_type_t subset_type, idx_t a1, idx_t a2) const
将条目索引的子集复制到另一个索引
- 返回值:
复制的条目数
-
double imbalance_factor() const
1= 完全平衡, >1: 不平衡
-
void print_stats() const
显示有关反向列表的一些统计信息
-
size_t compute_ntotal() const
计算列表大小的总和
公共成员
-
std::string filename
-
size_t totsize
-
uint8_t *ptr
-
bool read_only
-
LockLevels *locks
-
OngoingPrefetch *pf
-
int prefetch_nthread
-
size_t nlist
可能的键值的数量
-
size_t code_size
每个向量的编码大小(以字节为单位)
-
bool use_iterator = false
请求使用迭代器而不是 get_codes / get_ids
公共静态属性
-
static const size_t INVALID_CODE_SIZE = static_cast<size_t>(-1)
用于 BlockInvertedLists,其中代码被打包成组,并且单个代码大小没有意义
-
struct Slot
公共函数
-
Slot(size_t offset, size_t capacity)
-
Slot()
公共成员
-
size_t offset
-
size_t capacity
-
Slot(size_t offset, size_t capacity)