2012-05-04 59 views
2

我試圖加快在RoR應用程序w/Postgres數據庫中的搜索功能。我現在不會解釋它是如何工作的......只是用一種/實現的方法去做!紅寶石 - 檢查是否存在相交

我有x個記錄(可能是一個相當數量),每個記錄都有一個關聯的Facebook ID號碼陣列......可能高達5k。我需要用個人的朋友ID列表進行搜索,以確定搜索數組與任何(和哪些)記錄的數組之間的交集存在。

我不需要知道交集的結果,只是它是真是假。

任何好點子?

謝謝!

回答

3

剛開始使用純Ruby,因爲你不提數據存儲區:

friend_ids = user.friend_ids 
results = records.select { |record| !(record.friend_ids & friend_ids).empty? } 

results將包含有共同的至少1 friend_id的所有記錄。如果您必須檢查大量記錄,這不會很快。

&是數組相交的操作,這是用C語言實現,你可以在這裏看到:http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-26

+0

感謝您的快速響應!對不起,即時消息寫在RoR,儘管我認爲寫一個儘可能低的解決方案將是最有效的。 –

+0

我也熱衷於避免使用&運算符,因爲我需要的只是一個真/假輸出...如果被檢查的第一個值存在於兩個數組中,則不需要繼續運算。 –

+0

在較低的水平?你什麼意思?如果你的意思是在ruby中循環數組並檢查第一個命中,那麼它比數組相交更慢。這是給你一個想法的基準http://stackoverflow.com/questions/9436663/data-structures-iterating-over-two-arrays-vs-converting-to-sets-and-performing – ctcherry

1

一個可能更快@ ctcherry的回答,特別是當user.friend_ids具有高基數的版本:

require 'set' 
user_friend_ids = Set[ user.friend_ids ] 
results = records.select { |record| 
    record.friend_ids.any? { |friend_id| user_friend_ids.include? friend_id } 
} 

由於這隻爲user.freind_ids構建測試集(散列)只有一次,它可能也快於@Tass鏈接的Array#memory_efficient_intersect

這也可能是在數據庫中執行得更快,但沒有關於模型的更多信息,很難組成一個方法。