计算大型列表的方法

时间:2013-04-01 07:00:51

标签: python large-data

假设,我需要计算各种哈希方案的冲突。 输入序列中的元素数量为1e10 ^ 8或更多。 不知道如何分析这个,所以使用蛮力。

显然不要在RAM中保留这个哈希列表。 那是为我的需求编写代码的最佳方法吗?我应该把它转储到数据库或什么的?哪些库更适合使用?

谢谢!

2 个答案:

答案 0 :(得分:2)

我建议保留一组文件,每个文件都以其中包含的哈希的前缀命名(例如,如果使用前缀长度为6,那么名为ffa23b.txt的文件可能包含哈希ffa23b11d4334ffa23b712f3等等。每次读取哈希时,都会将其附加到文件中,其名称对应于哈希的前N个字符。

您还可以使用bloom filters快速排除大部分哈希值,而不必将所有哈希值存储在内存中。这样,如果针对布隆过滤器的检查显示您之前可能已经实际看到它,那么您只需要回退到搜索给定的前缀文件 - 这种情况很少发生。

答案 1 :(得分:1)

简短回答:如果你有几千兆字节的RAM,使用Python词典,这是最简单的实现方式(可能运行得更快)。你可以这样做:

>>> mydict = {}
>>> for i in some_iterator:
        mydict[i] = ''

然后检查映射中是否存在密钥:

>>> 0 in mydict
True

>>> 123456789 in mydict
False

长答案:您可以使用持久性键值存储,例如GDBM(看起来像Berkeley DB)或其他类型的数据库 - 但这种方法将是 way 比仅使用Python词典慢;另一方面,通过这种方法,你将具有持久性(如果你需要)。

您可以将GDBM理解为持久保存在单个文件中的字典(键值存储)。您可以按如下方式使用它:

>>> import gdbm
>>> kv = gdbm.open('my.db', 'cf')

然后将创建文件my.db(请参阅Python GDBM documentation以了解cf的含义)。

但它有一些限制,因为只支持字符串作为键和值:

>>> kv[0] = 0
Traceback (most recent call last)
[...]
TypeError: gdbm mappings have string indices only

>>> kv['0'] = 0
Traceback (most recent call last)
[...]
TypeError: gdbm mappings have string elements only

>>> kv['0'] = '0'

您可以使用具有虚拟值的所有密钥填充gdbm数据库:

>>> for i in some_iterator:
        kv[str(i)] = ''

然后检查映射中是否存在密钥:

>>> '0' in kv
True

>>> '123456789' in kv
False