Generated by Answer me with HTML 0.5.7 · 2026-10-23 09:43 · ★ Star on GitHub
和你现在的 ChromaDB 比运行内存
同一份 1911 条 1024 维向量,同一进程内实测
结论
- 同一份库同一次查询:ChromaDB 129 MB,FAISS+HNSW 48 MB,FAISS+IVF-PQ 58 MB。
- 省下的 81 MB 来自换掉 chroma 这层壳,不是来自压缩向量。
- IVF-PQ 比 FAISS+HNSW 还多占 10 MB,且召回从 0.989 掉到 0.675。
实测内存阶梯
| 阶段 | ChromaDB | FAISS+HNSW | FAISS+IVF-PQ |
|---|---|---|---|
| 导入后含 numpy | 72.0 MB | 39.2 MB | 39.2 MB |
| 打开库或建索引 | 84.0 MB | 55.3 MB | 48.8 MB |
| 装库加查询稳态 | 128.9 MB | 48.2 MB | 58.3 MB |
| 相对 numpy 增量 | +104.7 MB | +23.6 MB | +33.8 MB |
| 索引本体 | 7.83 MB | 9.10 MB | 1.43 MB |
数据
| ChromaDB 全栈 | 104.7 |
|---|---|
| FAISS IVF-PQ 全栈 | 33.8 |
| FAISS HNSW 全栈 | 23.6 |
| ChromaDB 索引本体 | 7.83 |
| FAISS IVF-PQ 索引本体 | 1.43 |
81 MB 差在哪
chromadb 库本体47.8 / max 14.7 MB
client 打开 sqlite 段12 / max 0 MB
取向量 Python 副本44.9 / max 0 MB
压缩省下的部分max 6.4 MB
- chromadb 导入即占 47.8 MB,faiss 只占 14.7 MB。
- chroma 打开 sqlite 与向量段再加 12.0 MB。
- 调 get 取向量走 Python list 副本,峰值多 44.9 MB。
- 压缩本身只值 6.4 MB,不是主因。
精度代价实测
recall@10,100 次随机查询,真值取 IndexFlatL2 精确解:
| 方案 | 召回 | 备注 |
|---|---|---|
| HNSW M16 ef32 | 0.989 | 现在这套 |
| IVFFlat nlist64 nprobe8 | 0.916 | 不压缩,仅聚类 |
| IVF-PQ m128 全探簇 | 0.799 | 压缩 32 倍 |
| IVF-PQ m64 nprobe8 | 0.675 | 压缩 64 倍 |
你的库量撑不起 IVF-PQ
faiss 训练时报:1911 点聚 256 簇,至少需 9984 点。码本严重欠采样,召回因此掉三分之一。
该怎么做
- 换壳省下的 RSS
- 81 MB
- 占现进程 331 MB
- 24 %
- 算法变更
- 保持 HNSW
- 精度损失
- 0
- faiss 磁盘占用
- 139 MB
- 要省运行内存:chroma 换 faiss,算法保持 HNSW,精度不变。
- 不要换 IVF-PQ:你的 1911 条喂不饱码本训练。
- 代价是元数据、过滤、全文检索要自己补,chroma 自带这些。
- 还要改 hy_memory 的存储层,不是换库就能跑。