我有一个大文件(950MB),它包含单词和频率如下,每行一个:
字1 54
字2 1
字3 12
字4 3
字1 99
字4 147
字1 4
字2 6
等。。。
我需要对单词的频率求和,例如 word1 = 54 + 99 + 4 = 157,并将其输出到列表/文件中。在 Python 中执行此操作的最有效方法是什么?
我试图做的是创建一个列表,每行都是这个列表中的一个元组,从那里求和,这让我的笔记本电脑崩溃了......
接下来试试:
from collections import defaultdict
d = defaultdict(int)
with open('file') as fh:
for line in fh:
word, count = line.split()
d[word] += count
您不必将整个文件读入内存。您还可以将文件拆分为多个较小的文件,分别处理每个文件并合并结果/频率。
>对于大多数现代机器来说,950MB不应该太多。我已经在Python程序中做了很多次,我的机器有4GB的物理内存。我可以想象用更少的内存做同样的事情。
不过,如果可以避免,您绝对不想浪费内存。上一篇文章提到逐行处理文件并累积结果,这是正确的方法。
如果您避免一次将整个文件读入内存,则只需担心累积的结果占用了多少内存,而不是文件本身。可以处理比您提到的文件大得多的文件,前提是您保存在内存中的结果不会变得太大。如果是这样,那么您将需要开始将部分结果保存为文件本身,但听起来这个问题并不需要这样做。
这可能是解决问题的最简单方法:
f = open('myfile.txt')
result = {}
for line in f:
word, count = line.split()
result[word] = int(count) + result.get(word, 0)
f.close()
print 'n'.join(result.items())
如果您使用的是 Linux 或其他类似 UNIX 的操作系统,请使用 top
在程序运行时关注内存使用情况。