Перестановка списков слишком велика для оперативной памяти в Python

Я написал программу для чтения списка слов из текстового файла (по одному слову в строке) и объединения их для получения каждой перестановки из 3 слов перед записью выходного файла перестановок, опять же по одному в строке.

import itertools

wordList = open("wordlist.txt", "r").readlines() # import words into list
wordListOut = open("output.txt", "w")

wordList = [item.rstrip() for item in wordList] # strip \n from list items
for item in [x for x in itertools.permutations(wordList, 3)]:
    wordListOut.write("".join("%s %s %s\n" % item))

wordListOut.close()

Кажется, он выполняет свою работу, но меня беспокоит то, что, когда весь текст хранится в ОЗУ в виде списка и itertools.permutations() создается список кортежей в ОЗУ, без очень большого wordlist.txt он быстро исчерпает память.

Было бы лучше, если бы каждая перестановка записывалась прямо в выходной файл, а не хранилась в ОЗУ, и в зависимости от размера wordlist.txt было бы лучше не загружать все это в ОЗУ.

Также как я могу избежать добавления \n в последнюю строку выходного файла?


person pooralfie    schedule 22.07.2014    source источник
comment
при чем здесь ваш вопрос? Если вы хотите записать в файл, посмотрите на модуль io и метод open(). Если вы не хотите писать \n для последней строки, либо удалите ее, либо, используя итератор, включите \n в начале итераций, а не в конце.   -  person ABMagil    schedule 22.07.2014


Ответы (1)


for item in [x for x in itertools.permutations(wordList, 3)]:

Эта линия не дает никакой пользы и только вызовет проблемы. permutations() не создает список , он использует генератор, который создает следующую перестановку по запросу. Помещая этот вызов в генератор списка, вы создаете этот список и гарантируете, что все перестановки существуют в памяти одновременно. Это лишает смысла использование генератора. Вы должны изменить строку, чтобы она была просто:

for item in itertools.permutations(wordList, 3):
person unholysampler    schedule 22.07.2014