数据检索和索引

Data retrieval and indexing

本文关键字:索引 检索 数据      更新时间:2023-10-16

我在数据库的boost共享内存中存储了大约800000行数据。数据的格式为:

Id        Color        Length          Size
1        1                 2            4
2        3                 4            5
3        2                 2            0
4        1                 2            4......and so on

颜色可以是从1-12到长度1-4和大小1-5的值,Id、Length、Color和Size分别存储在共享内存中,大小为800000。所以有Id向量表示Id,Color向量表示Color等等

我想在进行计算之前先过滤数据。所以我想要颜色为1,长度为2,大小为4的数据,即上面情况下的行1和4。有没有任何有效的方法来过滤数据,而不使用for循环,检查所有80万张图像并检查条件?

现在我只是使用mysql语句来获取满足条件的数据的Id。

"select Id from features_table where Color=1 and Length=2 and Size =4"

但是有没有更快的方法呢?还是应该坚持这种方法?我正在寻找一种更快的方法,所以我不确定从数据库中获取Id是否会增加算法的执行时间。

在这种情况下,我还可以考虑其他哪些选择?我读过哈希表、B树、二进制搜索树,我很困惑哪一个适合这种情况。kd-tree在这种情况下会有帮助吗?因为许多图像可能具有相同的颜色、长度和大小组合。我不确定kd-tree是否是正确的做法。我在opencv中读到了用于kd-tree的FLANN。在这种情况下,有什么例子或资源可以帮助吗?或者有任何内置的c++库吗?

听起来你只做过一次。如果是这种情况,那么创建包含所有元素的任何数据结构都将比测试每个元素慢。请确保在其中任何一个元素失败后继续下一个元素(在C/C++中,如果语句的color==1&&length==2&&size==4将自动为您进行短路评估)。将数据读取到缓冲区中,而不是一次读取一行或其他内容。向零循环,并在解析数组索引时使用指针来避免隐式乘法。除此之外,没有想到任何优化。

除了检查每个数据项并根据复杂度为O(n)的过滤器进行检查之外,没有更快的方法来过滤数据。您必须至少访问一次每个项目。同样的道理也适用于从你的数据中构建任何类型的数据结构,如树、哈希表等。如果你只对过滤一次数据感兴趣,只需查看它并获得过滤列表。如果你需要执行其他数据操作,你应该考虑你将需要什么操作(插入、删除、排序等),并根据你的预期用途选择最有效的数据结构。