-3

我在使用 python 的 hadoop 流作业中遇到内存问题。在程序中,我需要一个结构,如下所示:

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

在reduce中(只有reducer),我会计算每个metric_id有多少用户。现在大约有100,000,000个用户,它消耗大约6G内存。

我试过 module 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
4

1 回答 1

1

这根本不是一个好主意。我无法想象您需要一次加载所有 100,000,000 个用户。

如果您确实需要通过 metric 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 长度对象的长度。

于 2012-12-19T12:58:16.267 回答