处理巨型组合python的最佳方法

时间:2015-09-16 14:07:09

标签: python bigdata

我有一堆Twitter数据(来自450k用户的3亿条消息),我正试图通过@mentions解开社交网络。我的最终目标是拥有一堆配对,其中第一项是一对@mentions,第二项是提及两个人的用户数。例如:[(@sam, @kim), 25]。 @mentions的顺序并不重要,所以(@sam,@kim)=(@kim,@sam)

首先我创建一个字典,其中键是用户ID,值是一组@mentions

for row in data:
    user_id = int(row[1])
    msg = str(unicode(row[0], errors='ignore'))

    if user_id not in userData:
        userData[user_id] = set([ tag.lower() for tag in msg.split() if tag.startswith("@") ])
    else:
        userData[user_id] |= set([ tag.lower() for tag in msg.split() if tag.startswith("@") ])

然后我遍历用户并创建一个字典,其中键是@mentions的元组,值是提到两者的用户数:

for user in userData.keys():
    if len(userData[user]) < MENTION_THRESHOLD:
        continue
    for ht in itertools.combinations(userData[user], 2):
        if ht in hashtag_set:
            hashtag_set[ht] += 1
        else:
            hashtag_set[ht] = 1

第二部分是FOR FOR FOR运行。有没有更好的方法来运行这个和/或更好的方式来存储这些数据?

1 个答案:

答案 0 :(得分:3)

我建议您使用生成器来管理数据,而不是像现在一样尝试在内存中执行所有这些操作。查看David Beazely撰写的PyCon 2008幻灯片:http://www.dabeaz.com/generators-uk/GeneratorsUK.pdf

特别是,第2部分有许多解析大数据的例子,这些例子直接适用于你想要做的事情。通过使用生成器,您可以避免现在的大部分内存消耗,我希望您会看到显着的性能提升。