Python 计算大型列表的方法

Python 计算大型列表的方法,python,large-data,Python,Large Data,假设,我需要计算各种散列方案的冲突。 输入序列中的元素数为1e10^8或更多。 不知道如何分析计算,所以使用蛮力 显然,不应该在RAM中保留此哈希列表。 这是为我的需要编写代码的最佳方式吗?我应该把它倒进数据库还是别的什么?首选哪些库 谢谢大家! 我建议保留一组文件,每个文件的名称中都包含一个哈希前缀(例如,如果使用前缀长度6,那么名为ffa23b.txt的文件可能包含哈希值ffa23b11d4334,ffa23b712f3,等等)。每次读取散列时,都会将其附加到文件中,名称对应于散列的前N个字

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

显然,不应该在RAM中保留此哈希列表。 这是为我的需要编写代码的最佳方式吗?我应该把它倒进数据库还是别的什么?首选哪些库


谢谢大家!

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


您还可以使用快速排除大部分散列的唯一性,而无需将所有散列存储在内存中。这样,如果对bloom筛选器进行的检查表明您以前可能见过某个前缀文件,那么您只需返回到搜索该前缀文件,这种情况很少发生。

简短回答:如果您有一些GB的RAM,请使用Python字典,这是最容易实现的方法(而且可能跑得更快)。您可以执行以下操作:

>>> mydict = {}
>>> for i in some_iterator:
        mydict[i] = ''
然后检查映射中是否存在密钥:

>>> 0 in mydict
True

>>> 123456789 in mydict
False
>>> '0' in kv
True

>>> '123456789' in kv
False
Long answer:您可以使用持久性键值存储,比如(看起来像Berkeley DB)或其他类型的数据库——但这种方法比只使用Python字典要慢得多;另一方面,使用这种方法,您将具有持久性(如果需要)

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

>>> import gdbm
>>> kv = gdbm.open('my.db', 'cf')
然后将创建文件
my.db
(请参阅以了解
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 mydict
True

>>> 123456789 in mydict
False
>>> '0' in kv
True

>>> '123456789' in kv
False

如何以这种方式找到冲突?对于将生成哈希的每个输入,您应该:1)检查哈希是否存在于
kv
中(如果存在,则存在冲突)。2) 将此输入添加为此哈希的可能生成器之一(类似于:
kv[hash]=kv[hash]+[input]
——您应该在第一次生成此哈希时将
kv[hash]
创建为
列表。