2012-04-26 33 views
2

這是我們正在努力解決的問題。 我們正在處理大量項目的巨大流數據。我們也有一個預定義的項目列表。我們需要檢查一個流中的每個項目是否屬於我預定義的非常大的列表(大約400萬項)。查找/檢查操作應儘可能高效檢查一個巨大的列表中的流項目

如果這裏的人可以幫助我指出論文/算法,我可以閱讀以正確的方式處理這個問題,那將是非常好的。

感謝,

回答

0

您可能需要來解決

  • 之前縮小一些假設將你的預定義列表適合在主內存中?
  • 訪問模式是什麼樣子?大多數流式傳輸的項目是相同類型還是所有類型都可以同等表示?
  • 您的物品很小(整數/短弦)?如果沒有,每個人是否有唯一的標識符?
  • 預定義列表是靜態還是會改變?多頻繁?

一般來說,您會希望維護一個對象的散列表(或代表這些對象的唯一鍵),並查看每個對象,因爲它通過您的流進來。散列表提供了快速查找,如果您的數據集是靜態的,它們對於您描述的用例來說是理想的。但是,在其他解決方案可能表現更好的情況下,上述問題應該揭示是否是這種情況。

進一步的閱讀,我會爲你向Data StructuresBig-O符號的文章在維基百科上

編輯:我砍死在一起,這種快速程序來衡量蟒蛇哈希查找性能:

#!/usr/bin/python 

import random 
import string 
import time 

# return a random username, all lowercase, between n and m characters long 
def generate_username(min_length = 5, max_length = 10): 
    n = random.randint(min_length, max_length) 
    return ''.join(random.sample(string.ascii_lowercase, n)) 

# Build a hash table of 4mil usernames (the 'predefined items') 
users = set() 
for i in xrange(4000000): 
    users.add(generate_username()) 

# Build a 'stream' of usernames to check against the hash table 
stream = [] 
for i in xrange(10000000): 
    stream.append(generate_username()) 

# Measure performance of hash lookups for 10mil usernames 
start = time.clock() 
for name in stream: 
    if name in users: 
     pass #print "%s is present" % name 
end = time.clock() 

print "%fs (%f - %f)" % (end - start, start, end) 

結果:

3.660000s (238.100000 - 241.760000) 

所以在Python中,你可以檢查10米在不到4秒的時間內,用戶數量達到上限,相當於流媒體大於17MB/s。你真的需要多快? :)

+0

感謝您的回覆, – thickblood 2012-04-26 07:35:39

+0

回答您的問題1)我的列表不適合在主內存中。 2)訪問模式將是相同的類型。 3)我的項目是短串。更具體。他們是用戶名。 4)這個列表也是一個靜態列表。它不會改變。增量更新我的列表並不關心我。我正在考慮使用哈希表的方式。因爲我的輸入數據是高速數據流,所以我一直在尋找在流設置中使用的高效散列算法的指針 – thickblood 2012-04-26 07:42:23

+0

用戶名最多可能平均大約10個字節。 '4mil * 10 = 40MB',我錯過了什麼嗎? – dwurf 2012-04-26 07:46:39

相關問題