我对在大数据集上进行knn搜索很感兴趣。
有一些库可以使用:ANN 和 FLANN,但我更关心的问题是:如果你的数据库无法完全装入内存(RAM),该如何组织搜索?
回答:
我想这取决于你的索引与内存相比有多大。我的第一反应是以下几种想法:
-
假设索引的大小是内存的几十倍,我会尝试使用层次聚类树(例如FLANN中实现的)来对数据进行聚类。我会修改树的实现,使其将分支保存在内存中,而将叶子节点(即聚类)保存到磁盘上。因此,每次都需要加载适当的聚类。你可以尝试以不同的方式进行优化。
-
如果索引的大小不是那么大(假设是内存的两倍),我会将数据集分成两部分,并为每一部分创建一个索引。因此,我需要在每个数据集中找到最近邻,然后在它们之间进行选择。