Python - builtins.MemoryError: в программе для подсчета слов в большом текстовом файле - PullRequest
0 голосов
/ 09 октября 2018

Это программа для подсчета слов в большом текстовом файле.Я считаю слова и отображаю 20 наиболее распространенных слов.

    from timeit import default_timer as timer
    from collections import Counter

    start = timer()

    with  open("word5gb.txt", 'r') as input_file:
        file_contents = ""
        for line in input_file:
            file_contents += line
            word_list = file_contents.split() #create word list
            new_list = sorted(word_list, key=Counter(word_list).get, reverse=True)  #sorting
            new_list = list(dict.fromkeys(new_list)) #eliminates duplicates
            print(new_list[0:20])
            print(new_list[-20:-1])        

    end = timer()

    print('\n', "Time: ", round(end - start, 2), "s (", round(((end - start)/60),2), " min)")

Но когда я запускаю программу, используя текстовый файл 5 ГБ, через некоторое время отображается информация об ошибке:

word_list = file_contents.split() #create word list
builtins.MemoryError:

У меня 8 ГБ, Windows 64-bit, и я использую Python 3.7 64-bit.

Мне нужна ваша помощь.Как быстро и просто решить эту проблему?

1 Ответ

0 голосов
/ 09 октября 2018

Похоже, что нет необходимости хранить все содержимое файла в переменной file_contents.

Вы можете сэкономить память, избавившись от этой строки

file_contents += line

и просто обработав файлпострочно, используя строковую переменную вместо file_contents.

Если вам просто нужно получить наиболее распространенные слова, вы можете обновить счетчик словами каждой строки и, наконец, получить наибольшее число простых чисел, используя метод Counter most_common:

from timeit import default_timer as timer
from collections import Counter

start = timer()
cnt = Counter()

with open("word5gb.txt", 'r') as input_file:
    for line in input_file:
        word_list = line.split() #create word list
        cnt.update(word_list)
    print(cnt.most_common(20))

end = timer()

print('\n', "Time: ", round(end - start, 2), "s (", round(((end - start)/60),2), " min)")
...