我想使用LSH构建一个包含数百万个高维矢量的大型可扩展数据库。由于我必须将所有数据保存在ram中以便快速查询,因此必须将数据分发到多个服务器上以保存所有对象。
一种天真的方法是将所有对象传播到不同的服务器并向每个服务器发送一个查询。具有最佳答案的服务器具有正确的对象。
我确信必须有一些更好的解决方案,其中不必将查询发送到所有服务器节点,并且在一台服务器上将类似对象组合在一起。
对于分布式LSH表,什么是好方法?也许甚至还有一些项目?
感谢任何提示。
答案 0 :(得分:2)
首先,您要考虑访问数据的密钥。您想要哈希的是这些键 - 如果您知道要访问的确切键,则可以对它们进行哈希处理,以确定要查询的服务器 - 无需查询每个服务器。
如果您不知道确切的密钥(因为我怀疑是您的情况),事情会变得更难 - LSH会为您的记录生成总排序 - 类似的记录可能(但不能保证)具有相同的哈希值。我认为这是,例如,超平面到其原始矢量长度的映射...因此,例如,如果搜索类似(但不相同)的超平面到4到5之间的超平面来自原点的单位,一个开始寻找的好地方是其他来自原点的4到5个单位之间的超平面。因此,如果这个“距离原点的距离”是您的位置敏感哈希函数,您可以使用它来shard您的数据,并且这样做 - 您可以通过仅搜索分片来减少负载(同时增加最坏情况延迟)具有匹配的'距离原点'LCH。利用这种特定的LCH,其中相似性与散列线性相关,有可能在仅访问分布式服务器的子集时获得确定的结果。所有LSH功能都不是这种情况。
恕我直言,一切都取决于您的LSH功能 - 选择取决于您的应用程序的具体情况。