一句话定义
向量库的内存账 = 向量本体 × 压缩率 + 索引结构(图/倒排) + 元数据与运行时开销,再乘以副本数;掌握这张账本,就能在动手之前判断一个方案"放不放得下、值不值得买"。
为什么重要
向量检索的成本结构与关系库完全不同:向量本体是内存大户(fp32 下 1 亿条 768 维就是约 300 GB),索引结构次之,而量化(kp-011/012)与磁盘路线(kp-013)的每一分收益都要在账本上兑现。容量估算错误是"上线三个月被迫重构"的最常见原因——要么内存爆掉,要么为用不上的性能多付三倍账单。
前置知识
kp-011(SQ 压缩率)、kp-012(PQ 字节数)、kp-008(HNSW 图内存公式)。
核心概念
- 向量本体:N × d × bytes(fp32=4、fp16=2、int8=1、PQ=m 字节)。
- 图结构:HNSW 约 N × 2M × 4 字节(层 0 每节点 2M 个 4 字节邻居指针,高层占比小)。
- 元数据:主键、标量字段、墓碑、映射表——随过滤字段数量与更新频率增长。
- 运行时开销:页缓存、查询缓冲、构建期临时空间(建索引峰值可达数据量 1.5~2 倍)。
- 副本乘法:内存与存储成本按副本数线性放大(可用性换钱,见 kp-029)。
原理与机制
三档典型规模的完整账本(768 维、M=16、单副本):
规模 N 向量fp32 向量int8 HNSW图(2M×4B) 合计(fp32/ int8+图)
10 万 0.29 GB 0.07 GB 0.01 GB 0.3 GB / 0.09 GB
1000 万 29.5 GB 7.4 GB 1.28 GB 30.8 GB / 8.7 GB
1 亿 295 GB 74 GB 12.8 GB 308 GB / 87 GB读法与推论:
- 百万级以内:fp32 直接放得下,量化收益有限,优先简单(kp-006 的 Flat 适用域)。
- 千万级:int8+图 ≈ 9 GB,一台大内存单机从容;fp32 开始需要认真规划。
- 亿级:fp32 方案(300+ GB×副本数)进入专用高内存机型或分布式区间;int8 压到 90 GB 内,PQ(m=96 → 9.6 GB)或 DiskANN(内存≈PQ+图 ≈ 25 GB)进一步降档——这正是 02 模块各压缩算法存在的经济理由。
- 十亿级:纯内存不可行,DiskANN/SPANN 类磁盘路线(内存 1~2 成)成为默认,代价是延迟上移(kp-013)。
月费折算:内存型云主机与普通机型的价差约 3~5 倍;1 亿向量 fp32 三副本(≈900 GB 内存)与 int8 三副本(≈270 GB)的月费差距常以千美元计——量化的收益不在 PPT 里,在账单里。
公式或模型
总内存 ≈ N × (d × bytes + 2M × 4B×系数) + 元数据 + 运行时余量(20~30%)
成本(月) ≈ 总内存 × 副本数 ÷ 机型内存单价 + SSD容量 × 盘单价图示
内存构成(1亿条, int8, M=16):
████████████████████████████████░░░░░░ 74GB 向量(int8)
██████░░ 13GB HNSW 图
██░░ 5GB 元数据+标量索引
███░░ 8GB 运行时余量(约20%)
合计 ≈ 100GB → ×副本数实例或案例
容量评审实录:业务报"预计 5000 万条、1536 维、要求 99.9% 可用(两副本)"。按 fp32 账本:5000 万×1536×4B×2 副本 ≈ 580 GB 内存,内存型机型月费高昂;改用官方建议的 Matryoshka 截断到 256 维 + int8:5000 万×256×1B×2 ≈ 25 GB + 图 ≈ 3 GB + 余量 ≈ 40 GB——先动维度与精度,再谈扩容,是成本优化的第一杠杆(呼应 kp-028)。
直观类比
内存账像装修预算:向量本体是"面积×单价"的大头,索引结构是"水电改造",元数据是"家具",副本是"同一套房装两遍"。先决定"住多大、装什么档次"(维度与精度),再谈户型(分片副本),顺序反了预算必爆。
常见误区
- "只算向量不算图"——HNSW 图在高 M、高维场景可占内存 10%~30%,漏算会在压力测试时 OOM。
- "量化收益按压缩率线性兑现"——压缩率 4 倍不等于省 4 倍钱:图不压缩、元数据不压缩、还要补 efSearch 的 CPU;账要按合计口径算。
- "建索引时的峰值内存 = 稳态内存"——构建期临时结构(候选队列、排序缓冲)可使峰值达稳态 1.5~2 倍,按稳态配机器会在灌数时被打爆。
- "副本只翻倍数据"——副本同时翻倍内存、索引与写入流量,是可用性决策(kp-029)不是免费开关。
自测题
- 2 亿条 1024 维、M=32、int8、三副本,内存估算?
- 为什么"先降维度、再谈量化"是第一杠杆?
- 稳态 100 GB 的库,灌数期要预留多少内存?
答:向量 2e8×1024×1B ≈ 191 GB;图 2e8×64×4B ≈ 48 GB;加 20% 余量 ≈ 287 GB;×3 副本 ≈ 860 GB——fp32 同条件约 3.4 TB,量化必要性一目了然。
答:内存与 d 线性相乘,维度减半等于所有项(含索引构建时间)减半,且无精度代偿复杂度(Matryoshka 截断即可);量化只动精度项。
答:按峰值 1.5~2 倍预留,即 150~200 GB,否则索引构建或合并窗口可能 OOM;或采用分批构建+错峰合并。
与其他知识点的关系
kp-011/012 提供压缩率的分子项;kp-008 提供图内存公式;kp-013 用 SSD 换内存改写整张账本;kp-029 把副本与分片乘进总账。
延伸阅读
Jayaram Subramanya et al., "DiskANN…"(NeurIPS 2019)——第 1 节对"十亿级向量的内存不可行性"的账本式论证,是本篇成本视角的原始出处。