2

データベースのブースト共有メモリに約 800,000 行のデータが格納されています。データの形式は次のとおりです。

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、長さ、色、サイズは、共有メモリ内の 800,000 サイズの個別のベクトルに格納されます。したがって、Id には Id ベクトル、Color には Color ベクトルなどがあります。

計算を実行する前に、データをフィルター処理したいと考えています。したがって、色が1で長さが2でサイズが4のデータ、つまり上記の場合は行1と4のデータが必要です。forループを使用せずにデータをフィルタリングし、800,000枚の画像すべてを調べて状態を確認する効率的な方法はありますか?

現在、mysql ステートメントを使用して、条件を満たすデータの ID を取得しています。

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

しかし、これを行うより速い方法はありますか?または、この方法に固執する必要がありますか?より高速な方法を探しているので、データベースから Id を取得するとアルゴリズムの実行時間が長くなるかどうかはわかりません。

この場合、他にどのようなオプションを検討できますか? Hash table、B-Tree、Binary Search tree について読みましたが、このケースに適したものはどれなのか混乱しています。この場合、kd-tree は役に立ちますか?多くの画像は色、長さ、サイズの組み合わせが同じである可能性があるためです。kd-tree が正しいかどうかはわかりません。kd-tree に使用される opencv の FLANN について読みましたが、この場合に役立つ例やリソースはありますか? または、組み込みの C++ ライブラリはありますか?

4

2 に答える 2

0

あなたはこれを一度だけやっているように聞こえます。その場合、すべての要素を含むデータ構造を作成すると、各要素をテストするよりも遅くなります。いずれかの要素が失敗した後は、必ず次の要素に移動してください (C/C++ では、color==1 && length==2 && size==4 の if ステートメントは自動的に短絡評価を行います)。一度に1行などではなく、データをバッファに読み込みます。ゼロに向かってループし、ポインターを使用して、配列インデックスを解決するときに暗黙的な乗算を回避します。それ以外には、最適化は思い浮かびません。

于 2014-03-14T02:12:20.830 に答える