公式出处
本站只写能指到出处的公式。下面逐条列出:出处链接、查证日期、原文引用,以及这条出处在本站被用在哪里。 取不到出处的,本站不写上站——页面最后有一份「没写的东西」清单。
查证日期统一为 2026-09-21。上游文档会改,公式也可能随版本变; 你要是发现链接里的原文和下面的引用对不上,以链接里的为准,本站的数按引用的版本算。
本站用到的公式
FAISS 官方 wiki · Faiss indexes(索引一览表)
https://github.com/facebookresearch/faiss/wiki/Faiss-indexes查证日期:2026-09-21
IndexFlatL2 每条向量占 "4*d" 字节。
IndexIVFFlat 每条向量占 "4*d + 8" 字节,原文注明 "The 8 additional bytes are the vector id that needs to be stored."
IndexIVFPQ 每条向量占 "ceil(M * nbits/8)+8" 字节。
本站怎么用它:本站的原始向量占用(N × dim × 每分量字节数)、IVF 每条 8 字节 id、PQ 编码每条 ceil(m × nbits ÷ 8) 字节,都取自这张表。
FAISS 官方 wiki · Guidelines to choose an index(索引选择指南)
https://github.com/facebookresearch/faiss/wiki/Guidelines-to-choose-an-index查证日期:2026-09-21
HNSW 部分原文:“The memory usage is (d * 4 + M * 2 * 4) bytes per vector.”
本站怎么用它:本站 HNSW 图结构占用 = N × M × 2 × 4 字节,就是这条公式里减去原始向量 d×4 之后剩下的那一项。每条连接 4 字节,×2 对应第 0 层的邻居容量 2M。
FAISS 官方 wiki · The index factory(索引工厂串)
https://github.com/facebookresearch/faiss/wiki/The-index-factory查证日期:2026-09-21
“PQ16x12”(16 个子码、每码 12 位)对应的 code size (bytes) 写作 “ceil(16 * 12 / 8)”。
原文注明:位数省略时默认取 8。
本站怎么用它:本站 PQ 每条编码字节数用 ceil(m × nbits ÷ 8),向上取整这一步就来自这里。
FAISS 源码 · faiss/impl/ProductQuantizer.h
https://github.com/facebookresearch/faiss/blob/main/faiss/impl/ProductQuantizer.h查证日期:2026-09-21
成员注释:“size_t M; ///< number of subquantizers”、“size_t dsub; ///< dimensionality of each subvector”、“size_t ksub; ///< number of centroids for each subquantizer”。
码本字段注释:“Centroid table, size M * ksub * dsub. Layout: (M, ksub, dsub)”,类型是 std::vector<float>。
本站怎么用它:本站 PQ 码本占用 = m × 2^nbits × (dim ÷ m) × 4 字节。ksub = 2^nbits,dsub = dim ÷ m,float 取 4 字节。
hnswlib · ALGO_PARAMS.md(参数说明)
https://github.com/nmslib/hnswlib/blob/master/ALGO_PARAMS.md查证日期:2026-09-21
关于 M 的原文:“The parameter also determines the algorithm’s memory consumption, which is roughly M * 8-10 bytes per stored element.”
本站怎么用它:用作 HNSW 图结构量级的交叉核对:hnswlib 给的是 M × 8–10 字节/条,FAISS 给的是 M × 8 字节/条(M×2×4)。本站取 FAISS 的下限值,因为本站只报下限。
本站算出来的每一项,逐项对照
| 本站的项 | 公式 | 确定性 | 出处 |
|---|
| 原始向量数据 | N × dim × 每分量字节数 | 精确 | Faiss indexes |
| HNSW 邻居表 | N × M × 2 × 4 字节 | 按算法结构推 | Guidelines to choose an index |
| PQ 编码 | N × ceil(m × nbits ÷ 8) | 按算法结构推 | The index factory |
| 倒排表向量 id | N × 8 字节 | 按算法结构推 | Faiss indexes |
| PQ 码本 | m × 2^nbits × (dim ÷ m) × 4 字节 | 按算法结构推 | ProductQuantizer.h |
| 粗量化器质心表 | nlist × dim × 4 字节 | 按算法结构推 | Faiss indexes(质心表本身是一个 flat 索引) |
公式里每一项是什么:N 向量条数;dim 向量维度;M HNSW 每个点的最大出边数;m PQ 的子量化器个数;nbits 每个子码的位数;nlist IVF 的倒排桶数(也就是粗量化器的质心个数);2^nbits 每个子量化器的码字个数(FAISS 源码里叫 ksub);dim ÷ m 每个子向量的维度(源码里叫 dsub)。
单位口径
本站一律用二进制单位:1 KiB = 1024 字节,1 MiB = 1024 KiB,1 GiB = 1024 MiB = 1,073,741,824 字节。 不用 1000 进制的 KB/MB/GB。举个能对表的例子:100 万条 768 维 fp32 向量 =1,000,000 × 768 × 4 = 3,072,000,000 字节 =2.861 GiB(换成十进制的 GB 是 3.072 GB,差了将近 7%,所以口径必须写死)。
本站没写的东西,以及为什么不写
- 各家向量数据库的对象头长度、内存对齐策略、分配器碎片率——没有一家给出可引用的公开公式,本站不猜。
- 量化(fp16 / int8 / 二值)对召回率的影响——和数据分布强相关,没有通用公式,本站不评估。
- 磁盘落盘格式、压缩率、mmap 之后的常驻内存——随实现和操作系统页缓存变化,本站不出数。