Суммирование частот Python в файле - PullRequest
4 голосов
/ 07 мая 2011

У меня есть большой файл (950 МБ), который содержит слова и частоты следующим образом, по одному в строке:

word1 54

word2 1

word3 12

word4 3

word1 99

word4 147

word1 4

word2 6

и т.д ...

Мне нужно сложить частоты для слов, например, word1 = 54 + 99 + 4 = 157, и вывести их в список / файл. Какой самый эффективный способ сделать это в Python?

То, что я пытался сделать, это создать список, в котором каждая строка является кортежем в этом списке, подытоживая, это разбило мой ноутбук ...

Ответы [ 3 ]

5 голосов
/ 07 мая 2011

Попробуйте следующее:

from collections import defaultdict

d = defaultdict(int)

with open('file') as fh:
    for line in fh:
        word, count = line.split()
        d[word] += count
0 голосов
/ 07 мая 2011

950 МБ не должно быть слишком много для большинства современных машин, чтобы держать в памяти. Я делал это много раз в программах на Python, и моя машина имеет 4 ГБ физической памяти. Я могу представить себе то же самое с меньшим объемом памяти.

Вы определенно не хотите тратить память, если можете избежать этого. В предыдущем посте упоминалось, что построчно обрабатывали файл и накапливали результат, что является правильным способом сделать это.

Если вы избегаете одновременного чтения всего файла в память, вам нужно беспокоиться только о том, сколько памяти занимает ваш накопленный результат, а не о самом файле. Может быть возможно обрабатывать файлы намного больше, чем тот, который вы упомянули, при условии, что результат, который вы храните в памяти, не станет слишком большим. Если это так, то вы захотите начать сохранение частичных результатов в виде самих файлов, но это не похоже на то, что для этой проблемы требуется это.

Вот, пожалуй, самое простое решение вашей проблемы:

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, чтобы следить за использованием памяти во время работы программы.

0 голосов
/ 07 мая 2011

Вам не нужно читать весь файл в память . Вы также можете разбить файл на несколько небольших файлов, обработать каждый файл отдельно и объединить результаты / частоты.

...