Skip to content
🔗 分享本题
查看我的学习进度 →

HNSW 与 DiskANN 内存和 SSD 存储取舍图

🧠 记忆锚点:HNSW 用内存换低延迟;DiskANN 把冷数据放 SSD、热导航留内存。

💡 答案要点

DiskANN 核心定位:

  • 诞生命题: HNSW 全量内存才能快,但数据太大放不下怎么办?
  • 解决方案: 借助 SSD 磁盘存储 + 图索引,实现"内存级速度 + 磁盘级容量"

DiskANN 原理:

传统 HNSW(内存):全量放内存 → 速度快,但受限于内存容量

DiskANN(磁盘):

SSD 存储图索引(Vamana图):
    ┌─────────────────┐
    │    图索引文件    │ ← SSD 上
    │  (几百GB没问题)  │
    └─────────────────┘

    ┌─────────────────┐
    │   内存缓存层     │ ← 热数据放内存
    └─────────────────┘

    ┌─────────────────┐
    │   Beam Search   │ ← 磁盘图搜索
    └─────────────────┘

搜索过程:
1. Beam Search 在 SSD 图上搜索
2. 热路径数据缓存到内存
3. SSD 延迟 ~100μs,内存延迟 ~1μs
4. 通过缓存命中加速,P99 延迟接近内存 HNSW

DiskANN vs HNSW 对比:

维度HNSWDiskANN
存储介质全内存SSD + 部分内存
数据规模<1亿1亿~100亿
内存需求100% 数据10-20% 数据
延迟1-5ms5-20ms
召回率~95%~90%
成本高(内存贵)低(SSD便宜)

选型建议:

数据规模推荐方案原因
<100万HNSW(内存)延迟最低,效果最好
100万-1亿HNSW 或 IVF-PQ内存可接受
1亿-10亿DiskANN内存放不下,只能磁盘
>10亿分片 + DiskANN需要分布式架构

Milvus DiskANN 配置:

python
index_params = {
    "metric_type": "IP",
    "index_type": "DISKANN",
    "params": {
        "search_list_size": 100  # Beam Search 宽度
    }
}
collection.create_index(
    field_name="embedding",
    index_params=index_params
)

面试话术:

"DiskANN 类索引把大部分索引数据放在 SSD,并用内存缓存热点与导航结构,适合内存装不下的大规模 ANN 场景。它不是亿级数据的唯一选择;应在相同数据、硬件、过滤条件和召回目标下,对比 HNSW、IVF/PQ、DiskANN 及托管方案的召回率、P95/P99 延迟、构建时间和成本。"