Page 68 - 《软件学报》2026年第3期
P. 68
周依杰 等: GoVector: I/O-高效的高维向量近邻查询缓存策略 1031
部排序与页分配, 使得在实际查询过程中, 相似向量更可能被一并加载至同一磁盘页中. 这种布局更贴合第 2 阶段
以相似性为导向的拓展行为, 因此, GoVector 的布局方式有效提升了单次 I/O 的数据利用率, 使得下一次拓展顶点
与当前拓展顶点更大概率位于同一磁盘页中, 从而减少 I/O 开销并提升查询性能.
6 实验分析
6.1 实验设置
6.1.1 实验环境
本文所有实验均在一台高性能服务器上完成, 该服务器配备 Intel® Xeon® Gold 6248R 处理器 (3.00 GHz, 48
核心), 32 GB DDR4 内存 (3 200 MT/s) 以及两块 1.7 TB SSD, 顺序读写带宽最高可达 500 MB/s. 操作系统为
Ubuntu 22.04 LTS, 编译器版本为 GCC 11.4.0.
6.1.2 实验数据
[8]
[8]
实验采用 6 个公开的真实向量数据集 (见表 1), 包括 SIFT [33] 、Text2Img [34] 、DEEP 、Word2Vec 、MSong [8]
和 GIST [33] . 这些数据集涵盖图像、文本、音频和词向量等多种类型, 向量维度从 128 至 960 不等, 已被广泛用于
现有 ANNS 系统的性能评估.
表 1 实验数据集
数据集 数据集类型 向量维度 向量数量 查询数量 内容类型
SIFT float 128 1 000 000 10 000 图像
Text2Img float 200 1 000 000 1 000 图文混合
DEEP float 256 1 000 000 1 000 图像
Word2Vec float 300 1 000 000 1 000 词向量
MSong float 420 994 185 1 000 音频
GIST float 960 1 000 000 1 000 图像
6.1.3 对比系统及参数设置
本文将 GoVector 与当前两种代表性的基于磁盘的近似最近邻搜索系统 DiskANN 和 Starling 进行对比.
DiskANN 是由微软开发的一种基于图的高效磁盘 ANNS 方法, 采用贪婪搜索策略, 从预选的入口顶点出发,
沿图的邻接结构逐步逼近查询向量. 为了减少 I/O 开销, DiskANN 在内存中引入了静态缓存机制, 预加载访问频率
较高的入口顶点及其若干跳邻居. 本文中对其实验参数设置如下: 缓存顶点数为索引文件总大小的 1%, 默认执行
Top-100 查询, 图中每个顶点的邻居数 R 为 32, 搜索线程数 T 设为 32.
Starling 是近年来提出的一种磁盘驻留型索引图系统, 针对分段式数据布局优化了存储与查询路径. 其查询过
程中采用块级搜索策略, 以磁盘页为单位加载数据, 有效降低路径长度与 I/O 频次. 此外, Starling 基于拓扑结构引
入重排序算法 (BNF 策略), 使得相邻顶点尽量聚集于同一磁盘页中, 从而提升 I/O 利用率. 在本文实验中默认重排
序策略为 BNF, 其余参数设置与 DiskANN 保持一致.
GoVector 是本文提出的一种高效的混合缓存策略. 它通过静态与动态缓存相结合的机制, 在不增加内存占用
的前提下提升 I/O 命中率与整体查询吞吐量. GoVector 的核心思想是基于向量的相似性对索引进行物理布局优
化, 使在查询过程中拓展路径上的相邻顶点尽可能集中在同一磁盘页中, 从而提升局部性 (区别于 Starling 的拓扑
相似性重排序). 实验中设置的参数为: 静态缓存与动态缓存在总缓存顶点数中的比例设为 2:8, 其余参数与
DiskANN 一致.
6.2 系统整体表现
图 9 展示了不同 ANNS 方法在每秒处理的查询次数 (queries per second, QPS) 与召回率 (Recall) 之间的性能
对比. 其中, GoVector-hybrid 表示采用静态与动态缓存机制相结合的 GoVector (静态与动态缓存比例为 2:8),
GoVector-dynamic 则表示未使用静态缓存 (即静态缓存顶点数为 0) 的纯动态版本 GoVector.

