我在使用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
答案 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长度物体的长度。