【问题标题】:how to replace dict in python?如何在python中替换dict?
【发布时间】:2012-12-19 09:54:13
【问题描述】:

我在使用 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

【问题讨论】:

  • 修复您的应用程序...不太可能您想要流式传输 100.000.000 个用户数据....无论出于何种原因...被设计破坏

标签: python memory dictionary


【解决方案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 长度对象的长度。

【讨论】:

  • 致 jdotjdot:谢谢您的回答。在我的程序中,reducer 将收到许多值对,例如“metric_id,(user_id1,user_id2...)”。关键是一个user_id 可能会出现多对。例如: metric_id1,(user1,user2,user3) metric_id1,(user2,user4) 所以我必须使用 set() 来收集一个 metric_id 的所有 user_ids,删除重复的 user_ids,然后将它们计为最终结果。如果我预先计算每对的 user_ids 计数,也许最终我会在前面的示例中为 metric_id1 得到 5,而不是 4。无论如何,我会想另一种更好的方法来做到这一点。再次感谢
猜你喜欢
  • 2019-07-31
  • 2023-02-17
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
相关资源
最近更新 更多