faiss 如何選擇索引
flyfish
問題一:是否需要精確結果?
如果是,那麼應該使用 「flat」
能保證精確結果的只有 indexflatl2 或 indexflatip(inner product). 它們作為其他索引的基線結果.
問題二:是否關心記憶體?
請記住,所有faiss索引都儲存在ram中。 以下內容認為,如果不需要精確的結果,則ram是限制因素,並且在記憶體限制內,我們優化了精度與速度之間的權衡。
如果不在乎記憶體,那麼應該使用 「hnswx」
如果你的記憶體很大,或資料集很小,那麼 hnsw 是最好的選擇, 它是非常快、精確的索引.
如果稍微有點在意,那麼應該使用 「…,flat」
"…"表示必須事先執行資料集的聚類。 聚類後,「flat」僅將向量安排到儲存桶(bucket)中,因此不會壓縮它們,儲存的是原始資料,儲存大小與原始資料集相同。 速度和精度之間的權衡是通過nprobe引數設定的。
如果很在意,那麼應該使用 「pcarx,…,sq8」
如果儲存所有的向量開銷太大, 那麼可以如下兩個操作:
1、用主成分分析來減小到x維以減小維度
2、每個向量分量的標量量化為1個位元組
如果非常非常在意,那麼應該使用 「opqx_y,…,pqx」
問題三:根據資料集的大小,應該怎麼選擇?
m=百萬個向量
b=十億個向量
如果小於1m, 應該使用 「…,ivfx,…」
如果在1m-10m, 應該使用 「…,ivf65536_hnsw32,…」
如果在10m-100m,使用"…,ivf262144_hnsw32,…"
如果在100m-1b: 「…,ivf1048576_hnsw32,…」
官網針對典型的使用者案例進行了詳細的說明
indexing 1m vectors(1百萬)
indexing 1g vectors (10億)
indexing 1t vectors (1萬億)
Faiss教程 索引 2
所有的函式都是深複製,我們不需要關心物件關係。i o函式 複製函式 index factory通過字串來建立索引,字串包括三部分 預處理 倒排 編碼。預處理支援 倒排支援 編碼支援 如 index index factory 128,opq16 64,imi2x8,pq8 16 處理128維的向量,...
Faiss建立索引並儲存(C )
faiss 建立索引並儲存。如果用indexhnswflat,就採用indexidmap進行對映。這裡的距離不是ip,是l2 include index io.h include indexivf.h include indexivfflat.h include indexhnsw.h includ...
mysql 選擇索引 mysql選擇索引
1 盡量為用來搜尋 分類或分組的資料列編制索引,不要為作為輸出顯示的資料列編制索引。最適合有索引的資料列是那些在where子句中資料列,在聯結子句 現的資料列,或者是在group by order by子句 現的資料列。select 後的資料列最好不要用索引。2 綜合考慮各資料列的維度。資料列的維度...