如何在python中替换dict?

时间:2012-12-19 09:54:14

标签: python memory dictionary

我在使用python的hadoop流媒体作业中遇到内存问题。 在程序中,我需要一个结构看起来像:

dict{"metric_id":set(user_id1,user_id2...),...} 

在reduce(仅在reducer上),我将计算每个metric_id的用户数。现在大约有100,000,000用户,它消耗大约6G内存。

我已经尝试过模块shelve,但它很慢......也许我以错误的方式使用它看起来像:

tmp_set = set()
for id in value.split(","):
    if id != "":
        tmp_set.add(id) 
if self.ids_dict.has_key(metric_id):
    ori_set = self.ids_dict[metric_id]
    self.ids_dict[metric_id] = ori_set.union(tmp_set)
else:
    self.ids_dict[metric_id] = tmp_set

1 个答案:

答案 0 :(得分:1)

这不是一个好主意。没有理由我可以想象你需要同时加载所有100,000,000个用户。

如果您确实需要按指标ID访问用户数,那么您应该做的是在该数字的某处保留单独的字典或表格,例如

{'<metric id 1>': 3,
 '<metric id 2>': 5,
 ...
}

由于您已按原样存储此信息,因此您可以运行一次程序(这将非常慢)来收集此信息,这与

相似。
import collections
numbers = collections.defaultdict(int)
for id, users in mydict.iteritems():
    numbers[id] += len(users)

然后在添加/删除项目时更新该数据结构,以便预先计算此值。没有有效的方法来定期确定~100,000,000长度物体的长度。