当处理超过可用 RAM 的向量数据集时,三种实用的方法可以实现高效的向量搜索:基于磁盘的索引、批量流式传输数据和分层索引。每种方法在内存使用和计算效率之间取得不同的平衡,使开发人员能够处理大规模数据,而无需过多的硬件资源。
基于磁盘的索引将向量索引存储在磁盘上而不是在 RAM 中,使用内存映射技术根据需要访问索引的各个部分。例如,像 FAISS(Facebook AI Similarity Search)这样的库支持内存映射索引,其中只有查询所需的索引部分才会被加载到 RAM 中。这减少了内存压力,但由于磁盘 I/O 而增加了延迟。为了缓解性能问题,开发人员可以优化磁盘访问模式(例如,顺序读取)或使用 SSD 来获得更快的读取速度。基于磁盘的索引适用于可以接受延迟的场景,例如批处理或离线任务。但是,如果磁盘访问成为瓶颈,它们可能难以应对实时应用程序。
从磁盘流式传输数据涉及以较小的块处理向量,而不是加载整个数据集。例如,您可以将数据集拆分为存储在磁盘上的分片,然后一次将一个分片加载到 RAM 中进行搜索。像内存映射数组(例如,NumPy 的 memmap
)这样的工具允许部分加载向量,而无需将整个文件复制到内存中。另一种方法是使用支持流式传输的数据库或文件格式,例如 HDF5 或 Parquet。此方法需要仔细管理数据块,以避免冗余磁盘读取并确保在搜索期间可以使用相关的向量。虽然此方法最大限度地减少了 RAM 使用量,但可能需要在搜索速度方面做出权衡,特别是当查询需要扫描多个分片时。
分层索引结合了粗粒度和细粒度的搜索层,以减少计算开销。例如,一个两阶段过程可能使用快速的近似索引(如 FAISS 中的 IVF)来缩小存储在磁盘上的候选向量的范围,然后在加载到 RAM 中的较小子集上进行精确搜索。另一种变体是将数据集划分为集群并将集群质心存储在 RAM 中,同时将详细的向量保存在磁盘上。在查询期间,仅从磁盘检索最相关的集群进行比较。此方法利用了内存和基于磁盘操作的优势,从而平衡了速度和内存使用量。但是,它需要调整诸如集群大小和近似级别之类的参数,以保持准确性和性能。
开发人员应根据其特定的约束选择方法:基于磁盘的索引适用于简单性,流式传输适用于数据大小的灵活性,而分层索引则适用于速度和可扩展性的平衡。结合使用这些方法(例如,将分层索引与内存映射文件结合使用)可以进一步优化大规模向量搜索任务的性能。