pickle.load() 一个包含重复键和 reduce 的字典



出于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:粗略地说,这是数据流。

  1. 每日:使用 100-500 条新记录更新table_ownership。每条记录包含 1 或 2 个字符串(人员姓名(。
  2. 创建一个包含 3 个字母组的新哈希表,绑定到包含双峰的字符串。键是双峰,值是字符串列表(实际上是包含字符串和table_ownership记录的主键的元组。
  3. 每小时:使用 10-40 个要匹配的新名称更新table_people
  4. 在运行模糊匹配之前,使用哈希表提取最可能的匹配项。我们从myString和像potential_matches.append(hashTable[doublet]) for doublet in get_doublets(myString)这样的字符串中得到双峰
  5. 按共享双峰计数排序。
  6. 对前 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 秒。

最新更新