我正在研究一个字典结构,其中我有一个文档字典,每个文档都有一个单词字典(其中每个关键字是单词\ id(整数),值是计数),这样:
document_dict = { "doc1": {1:2, 2:10, 10:2, 100: 1}, "doc2": {10:2, 20:10, 30:2, 41: 19},...}
注意,内部字典非常稀疏,所以即使我有25万个单词,我也不希望每个文档有超过1千个键。你知道吗
在每次迭代中,我需要总结字数:数到其中一个文档,例如,我需要将一个新的dict{1:2,2:10,10:2,120:1}合并到“doc1”:{1:2,2:10,10:2,100:1}。你知道吗
现在,我的实现运行得很快,但是2小时后它就会耗尽内存(我使用的是40GB服务器)。你知道吗
我总结钥匙的方式是这样的:
假设新的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]
然后,因为我的dict在很短的时间内变得相当大,所以根本不可能用字典运行代码,所以我尝试将字典实现为两个列表的列表:例如doc1=[[],[],其中第一个列表保留键,第二个键保留值。你知道吗
现在,当我想要像这样联合2结构时,我首先尝试在doc1中获得新目录的每一项的索引。如果我成功地获得了一个索引,这意味着这个键已经在doc1中了,所以我可以更新相应的值。否则,它还不在doc1中,所以我将把新的键和值附加到列表的末尾。但是这种方法运行非常慢(在dict版本中,我可以在2小时内处理多达6000k个文档,现在我只能在15小时内处理250K个文档)。你知道吗
所以我的问题是:如果我想使用字典结构(key,val)对,其中我需要合并两个dict的键,并在每次迭代中求和它们的值,有没有一种方法可以更有效地实现这个空间?你知道吗
它不一定更节省空间,但我建议使用^{} 模块切换到基于磁盘的字典,这样就不必一次将整个字典都存储在内存中。你知道吗
它们非常易于使用,因为它们支持熟悉的字典界面,如下所示:
输出:
相关问题 更多 >
编程相关推荐