永久存储具有512个浮点数和100万条记录的数组以便快速搜索的最佳方法是什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了永久存储具有512个浮点数和100万条记录的数组以便快速搜索的最佳方法是什么?相关的知识,希望对你有一定的参考价值。

我有数百万张图像,每张图像,我已经将它们转换成512个数字来表示该图像中比像素更高的抽象级别。该数据集类似于包含512个字段和一百万行的表,其中填充了浮点数。

当给出新图像时,我希望能够查询100万条记录并按照“相似性”的顺序返回记录。相似性可以定义为512个元素的两个数组之间的最小差异和。

永久存储此数据并执行数值计算以便“图像搜索”快速的最佳方法是什么?

仅供参考:512个元素是图像分类中使用的卷积神经网络的中间输出特征。我正在尝试在给出新图像时返回最相似的图像。

我对此很陌生 - 我希望这个问题有道理。

我可以用许多不同的方式存储数据库...在sql数据库,csv文件中序列化...但我不确定的是什么是以后快速搜索的最佳格式。

答案

我的建议是矢量化,可能在Python的Numpy,MATLAB或Octave等中。基本上,这意味着你可以在两个矩阵之间采用不同的方式:

例如,在Python3中:

import numpy as np
pic1 = np.array([[1,2], [3,4]])
pic2 = np.array([[4,3], [2,1]])
diff = pic1 - pic2
dist = diff * diff
similarity = 1/ sum(sum(dist))
print(similarity)

这很快,因为现在你的操作是O(图片数量)而不是O(n * d ^ 2),其中d是图像边缘的维度

以上是关于永久存储具有512个浮点数和100万条记录的数组以便快速搜索的最佳方法是什么?的主要内容,如果未能解决你的问题,请参考以下文章

性能 - 使用 Spring JPA Data 搜索具有 2000 万条记录的表

C 中针对 100 万条记录的数组的内存优化

什么叫“写一个循环(for或者while)读入五个浮点数?”

如何将 map.getBounds() 作为 4 个浮点数的列表?

从 Azure 表存储的千万条记录中查询一条记录

通过分析音频频谱进行节奏检测