存储、索引支持高维(2048)特征向量
Storage, index support for high dimensional(2048) feature vector
我有2048维的特征向量,它被归一化了。
而且我需要将它存储在 postgresql 中以便快速访问以进行搜索。
使用余弦相似度或欧氏相似度进行搜索。
到目前为止我已经尝试过:
- 我试过 gin 索引,distances 函数根本不使用索引,所以顺序扫描很糟糕。
- cube 扩展,但有 100 维约束,可以将其增加到 128,之后要么索引失败,要么数据太大而无法连续存储。
- 将 2048 个维度拆分为 16128 个部分,并作为多维数据集数据类型存储在单独的 table(与 id 链接)中。但最后我必须计算距离总和。虽然比顺序扫描好。
- PCA - 对于降维,128 维向量的精度不够。
会有帮助:
- 此类工作负载的扩展(至少支持欧氏距离和索引)
- 改进
3
中的拆分搜索算法
- 其他开源数据库系统。
我发现 PostgreSQL(尽其所能)有基本的局限性。
我发现 elasticsearch 是很好的替代品。
它具有对基本结构化 data/types 的所有支持,并内置对高维向量的所有 L1、L2 和余弦距离的支持。
我尝试了 250.000 个样本,搜索时间不到一秒。
我有2048维的特征向量,它被归一化了。
而且我需要将它存储在 postgresql 中以便快速访问以进行搜索。 使用余弦相似度或欧氏相似度进行搜索。 到目前为止我已经尝试过:
- 我试过 gin 索引,distances 函数根本不使用索引,所以顺序扫描很糟糕。
- cube 扩展,但有 100 维约束,可以将其增加到 128,之后要么索引失败,要么数据太大而无法连续存储。
- 将 2048 个维度拆分为 16128 个部分,并作为多维数据集数据类型存储在单独的 table(与 id 链接)中。但最后我必须计算距离总和。虽然比顺序扫描好。
- PCA - 对于降维,128 维向量的精度不够。
会有帮助:
- 此类工作负载的扩展(至少支持欧氏距离和索引)
- 改进
3
中的拆分搜索算法
- 其他开源数据库系统。
我发现 PostgreSQL(尽其所能)有基本的局限性。
我发现 elasticsearch 是很好的替代品。
它具有对基本结构化 data/types 的所有支持,并内置对高维向量的所有 L1、L2 和余弦距离的支持。
我尝试了 250.000 个样本,搜索时间不到一秒。