我有一堆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运行。有没有更好的方法来运行这个和/或更好的方式来存储这些数据?
答案 0 :(得分:3)
我建议您使用生成器来管理数据,而不是像现在一样尝试在内存中执行所有这些操作。查看David Beazely撰写的PyCon 2008幻灯片:http://www.dabeaz.com/generators-uk/GeneratorsUK.pdf
特别是,第2部分有许多解析大数据的例子,这些例子直接适用于你想要做的事情。通过使用生成器,您可以避免现在的大部分内存消耗,我希望您会看到显着的性能提升。