处理大量组合python的最佳方法

Posted

技术标签:

【中文标题】处理大量组合python的最佳方法【英文标题】:Best way to deal with giant number of combinations python 【发布时间】:2015-09-16 14:07:09 【问题描述】:

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

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

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

第二部分需要 FOREVER 才能运行。有没有更好的方法来运行这个和/或更好的方法来存储这些数据?

【问题讨论】:

【参考方案1】:

我建议不要像现在这样在内存中做所有这些事情,我建议使用生成器来管道数据。查看 David Beazely 的 PyCon 2008 幻灯片:http://www.dabeaz.com/generators-uk/GeneratorsUK.pdf

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

【讨论】:

以上是关于处理大量组合python的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 Datatables 在 Laravel 中处理大量行的最佳方法是啥?

从RabbitMQ队列中读取大量消息的最佳方法是什么?

处理具有数百万条记录更新和大量读数的 MySQL 表的最佳方法

使用 AWS 处理 .csv 数据的最佳方式

Python DNS 处理模块 dnspython

在 Python 中划分大文件以进行多处理的最佳方法是啥?