容量估算怎么做
容量按「向量条数 × 维度 × 每维字节数 × 副本数 + 索引结构开销 + 元数据」逐项加总。float32 是基线,SQ8 约四分之一,PQ 与二值量化还能继续降;此外索引结构本身也占内存(例如 HNSW 的图边),元数据与倒排表常被忽略,因此实际内存占用往往明显高于纯向量计算出来的那个数。
基本信息
| 基线公式 | 向量条数 × 维度 × 4 字节,float32 情况 |
|---|---|
| 量化后 | SQ8 约四分之一,PQ 与二值量化更低 |
| 易漏项 | 索引结构、副本倍数、元数据与倒排表 |
| 规划方式 | 按原始可放下与量化后可放下两档做方案 |
典型使用场景
- 立项预算:向采购或云厂商说明需要多少内存与磁盘
- 扩容判断:现有集群还能撑多少数据量,何时必须扩容
- 方案对比:量化、分片、磁盘索引三条路线各自需要多少资源
- 压测准备:按估算配置资源,避免压测时因内存不足失真
- 上线前复核:把预估值与实际占用对比,修正估算模型
估算示例
估算示例
float32 原始:10^7 × 1024 × 4 B ≈ 40 GB # 一千万条 1024 维
SQ8 量化: ≈ 10 GB # 约四分之一
PQ(m=64): ≈ 0.64 GB # 精度损失需评估
元数据与 payload:按实际字段另计
HNSW 图结构:与 M、节点数相关,需预留可观比例
# 再乘副本数,得到集群层面的下限
内存构成拆解
| 组成部分 | 估算方式 | 备注 |
|---|---|---|
| 原始向量 | 条数 × 维度 × 4 字节 | float32 基线 |
| 量化向量 | 按位数折算 | SQ8 约为原始的四分之一 |
| 索引结构 | 与算法和参数相关 | HNSW 图边常占可观比例 |
| 副本倍数 | 按副本数整体放大 | 高可用与并发都要算进去 |
| 元数据 | 按字段长度与数量估算 | JSONB 类字段容易低估 |
先按「原始向量可放下」与「量化后能放下」两档做方案,再决定是否上磁盘索引或分片,避免一开始就在精度上做妥协。
留出增长余量:规划只按当前数据量做,半年后就可能因为增量文档被迫紧急扩容,扩容窗口通常比预留内存贵得多。