2014-02-11 109 views
2

我有大約800,000行數據存儲在數據庫的boost共享內存中。的數據是在以下形式:數據檢索和索引

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, 編號,長度,顏色,大小被存儲在單獨的載體共享內存中的大小爲800,000。所以有Id的Id向量,Color的顏色向量等等。

我想在執行一些計算之前過濾數據。所以我想要的數據顏色是1,長度是2和大小4,即行1和4在上面的情況。有沒有任何有效的方法來過濾數據,而不使用for循環並遍歷所有800,000圖像並檢查條件?

現在我只是使用mysql語句來獲取滿足條件的數據的Ids。

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

但是有沒有更快的方法來做到這一點?或者我應該堅持這種方法?我正在尋找更快的方法,因此我不確定從數據庫中獲取Ids是否會增加算法的執行時間。

在這種情況下,我可以考慮的其他選擇是什麼?我讀了關於哈希表,B樹,二進制搜索樹和我很困惑這適合這種情況。在這種情況下kd-tree會有幫助嗎?因爲許多圖像可能具有相同的顏色,長度和大小組合。我不確定kd-tree是否正確。我讀過關於用於kd-tree的opencv中的FLANN是否有任何示例或資源在這種情況下可能會有所幫助?還是有任何內置的C++庫?

+0

也許考慮調整MySQL參數。索引是否被使用?這個查詢是一個*精確匹配*,位圖索引應該加速的很好。如果MySQL支持這樣的事情。 –

回答

-1

沒有更快的方式來過濾數據,而不是檢查每個數據項並且檢查它是否與複雜度爲O(n)的過濾器相對照。您必須至少訪問每個項目一次。從數據構建任何類型的數據結構(如樹,散列表等)也是如此。如果您只想過濾一次數據,只需查看它並獲取過濾列表。如果您需要執行其他數據操作,則應考慮您需要執行的操作(插入,刪除,排序等),並根據您的預期用途選擇最有效的數據結構。

+0

真的嗎? -1?我的答案如何不具有建設性? –

0

這聽起來像你只是做了一次。如果是這種情況,那麼創建包含所有元素的數據結構將比測試每個元素慢。確保你在其中任何一個元素失敗後移動到下一個元素(在C/C++中,如果語句帶有顏色== 1 & & length == 2 & & size == 4會自動爲你評估短路)。將數據讀入緩衝區,而不是一次或一次執行任何操作。向零循環並使用指針來解析數組索引時避免隱式乘法。除此之外,沒有想到優化。