2014-03-26 66 views
0

我有一個可能存在於3K集合上的40K項目的列表,我想要計算每個項目存在多少集合。Redis:計算集合中項目發生的最好方法

簡單的算法,Python和省略爲簡單起見,一些管道的優化是這樣的:

ids = [1,2,3,4,5] 
set1 = (1,3) 
set2 = (2,3) 
set3 = (4,5) 
sets = [set1, set2, set3] 

ids_count = {} 
for id in ids: 
    ids_count[id] = sum([redis.sismember(id, set) for set in sets]) 

它將需要120M Redis的呼叫或3K使用流水線,都是很慢。 有沒有更好的方式來做到這一點,而不改變數據的存儲方式(我已經有redis的ID和列表列表)

回答

1

我認爲最有效的方式是下載整個事情(所有集合和所有的ids,你最終會按照你的描述去做),然後在記憶中做所有的事情。另外你的算法很可能將超過臺更高效的迭代,而不成員資格檢查,像這樣:

# ... 
for set in sets: 
    for id in set: 
     if id not in ids_count: 
      ids_count[id] = 0 
     ids_count[id] += 1 

這是假設你的表現是網絡的約束。但是你必須確定基準。

+0

謝謝,這樣做是真的很快從我的實施幾個小時到這一個 – Chemary

+0

很高興我可以幫助。 ;) – aepsil0n

相關問題