检查巨大列表中的流媒体项目

时间:2012-04-26 07:10:16

标签: performance list stream lookup

这是我们要解决的问题。 我们正在处理大量项目的大量流数据。我们还有一个预定义的项目列表。我们需要检查流中的每个项目是否属于我预定义的列表,这个列表非常庞大(大约400万个项目)。查找/检查操作应尽可能高效

如果这里的人能够帮助我指出我能读到的论文/算法以便以正确的方式解决这个问题,那将是很棒的。

谢谢,

1 个答案:

答案 0 :(得分:0)

在提出解决方案之前,您可能希望缩小一些假设

  • 您的预定义列表是否适合主内存?
  • 访问模式是什么样的?大多数流式项目是相同类型还是所有类型都可以平等表示?
  • 您的商品是否很小(整数/短字符串)?如果没有,是否每个都附有一个唯一的标识符?
  • 预定义列表是静态的还是会改变?多久一次?

一般来说,您需要维护对象的哈希表(或表示这些对象的唯一键),并在通过您的流进入时查找每个对象。散列表提供快速查找,如果您的数据集是静态的,则它们非常适合您描述的用例。然而,在某些情况下,其他解决方案可能表现更好,上述问题应该揭示是否是这种情况。

如需进一步阅读,我将引导您阅读维基百科上的Data StructuresBig-O符号文章

编辑:我将这个快速程序整合在一起,以测量python中的哈希查找性能:

#!/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中,您可以在4秒内检查1000万个用户名,相当于流媒体> 17MB / s。你真的需要多快? :)