出于MemoryError
的原因,我将一系列字典附加到像pickle.dump(mydict, open(filename, "a"))
这样的文件中。据我所知,整个字典都无法在我的笔记本电脑内存中构建。结果我在同一个腌制文件中有相同的密钥。该文件本质上是双峰和字符串的哈希表。数据如下所示:
{
'abc': [list of strings1],
'efg': [list of strings2],
'abc': [list of strings3]
}
主要问题:当我使用
pickle.load(open(filename, "r"))
时,有没有办法加入重复的字典键?问题2:有重复项重要吗?调用重复键会给我所有适用的结果吗?
例如:
mydict = pickle.load(open(filename, "r"))
mydict['abc'] = <<sum of all lists with this key>>
我考虑过的一个解决方案,但从 Python 知识的角度来看我不清楚:
x = mydict['abc']
if type(x[0]) is list:
reduce(lambda a, b: a.extend(b), x)
<<do processing on list items>>
编辑1:粗略地说,这是数据流。
- 每日:使用 100-500 条新记录更新
table_ownership
。每条记录包含 1 或 2 个字符串(人员姓名(。 - 创建一个包含 3 个字母组的新哈希表,绑定到包含双峰的字符串。键是双峰,值是字符串列表(实际上是包含字符串和
table_ownership
记录的主键的元组。 - 每小时:使用 10-40 个要匹配的新名称更新
table_people
。 - 在运行模糊匹配之前,使用哈希表提取最可能的匹配项。我们从
myString
和像potential_matches.append(hashTable[doublet]) for doublet in get_doublets(myString)
这样的字符串中得到双峰 - 按共享双峰计数排序。
- 对前 5000 个
potential_matches
应用模糊匹配,以table_fuzzymatches
存储高质量的结果
所以这很好用,它比直接模糊匹配快 10-100 倍。只有 200k 条记录,我可以在内存中制作哈希表并pickle.dump()
但对于完整的 1.65M 记录,我不能。
编辑2:我正在研究两件事:
- x64 蟒蛇 '
- collections.defaultdict'
我会回来汇报的。
答案:
- 32位Python有2GB的内存限制。 x64立即解决了我的问题。
但是,如果我没有可用的 64 位 Python 怎么办?
- 对输入进行分块。
当我使用 10**5 的块大小并零碎地写入字典时,它成功了。
对于计时,我的分块过程花了 2000 秒。 64 位 Python 将其速度加快到 380 秒。