处理大量组合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 中处理大量行的最佳方法是啥?