Как создавать и работать со списками из 30 или более элементов?

#python #python-3.x #collections #counter #ram

Вопрос:

Я пытаюсь подсчитать частоту слов в некоторых документах. Для фильтрации / очистки я использую SpaCy.

 from collections import Counter

nouns = []
length = 0
for sentence in sentences:
    for token in sentence:
        if token.pos_ == "NOUN":
            if token.is_stop is False and not token.is_punct and not token.is_digit and not token.like_num and len(token) >= 4:
                nouns.append(token.text)
                length  = 1

noun_freq = Counter(nouns)
common_nouns = noun_freq.most_common()
 

Когда я запускаю этот скрипт для нескольких тысяч или миллионов слов, он просто делает то, что должен делать. (Получите наиболее распространенные существительные).

Когда я использую более 10 миллионов слов, мое ядро уничтожает скрипт и показывает, что ему не хватает памяти.

из системного журнала:

 kernel: [458254.437276]  oom_kill_process.cold 0xb/0x10
kernel: [458254.437278]  out_of_memory.part.0 0x1df/0x3d0
kernel: [458254.437280]  out_of_memory 0x6d/0xd0
 

Какие существуют другие способы подсчета / получения частот наиболее распространенных слов для нескольких десятков миллионов слов?

Комментарии:

1. Похоже, вы могли бы разделить документ на куски и обработать таким образом

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

3. Как sentences создается? Вам действительно нужно nouns что-то еще, кроме перехода к Counter() ?

4. Сколько разных слов вы ожидаете?

5. Почему бы не использовать «вспомогательную» память, например sqlite , или какой-либо файл для хранения результатов, а не буферизовать все в памяти?