我正在研究一个字典结构,其中我有一个文档字典,每个文档都有一个单词字典(其中每个键是 word_id(整数)并且值是计数),这样:
document_dict = { "doc1": {1:2, 2:10, 10:2, 100: 1}, "doc2": {10:2, 20:10, 30:2, 41: 19},...}
请注意,内部字典非常稀疏,因此即使我有 250K 单词,我也不希望每个文档有超过 1K 的键。
在每次迭代中,我需要总结一个单词的字典:计数到一个文档,例如我需要将 {1:2, 2:10, 10:2, 120:1} 的新字典联合到“doc1 ": {1:2, 2:10, 10:2, 100:1}。
现在,我的实现运行得非常快,但是 2 小时后内存不足(我使用的是 40GB 的服务器)。
我总结密钥的方式是这样的:
假设 new_dict 是我要添加到 doc1 的新单词:计数对,例如:
new_dict = {1:2, 2:10, 10:2, 120: 1}
doc1 = {1:2, 2:10, 10:2, 100: 1}
for item in new_dict:
doc1[item] = doc1.get(item, 0) + new_dict[item]
然后因为用字典运行代码是不可能的,因为我的字典在很短的时间内变得非常大,我尝试将字典实现为 2 个列表的列表:例如 doc1 = [[],[]] 第一个列表保留键和第二个键保留值。
现在当我想联合2这样的结构时,我首先尝试获取doc1中new_dict的每个项目的索引。如果我成功获取了索引,则意味着该键已经在 doc1 中,因此我可以更新相应的值。否则,它还没有在 doc1 中,所以我将新的键和值追加()到列表的末尾。但是这种方法运行速度非常慢(在 dict 版本中,我能够在 2 小时内处理多达 600K 文档,现在我只能在 15 小时内处理 250K 文档)。
所以我的问题是:如果我想使用字典结构 (key, val) 对,我需要联合 2 个字典的键并在每次迭代中求和它们的值,有没有办法有效地实现更多空间?