Генерировать бесконечный поток комбинаций букв при сохранении памяти?

Я пытаюсь написать программу, которая генерирует строки одну за другой в разных комбинациях (начиная с «a» и заканчивая «zzzzzz*») и преобразует строку в хэши, а затем проверяет хэш для сравнения с другим хешем. В настоящее время я использую itertools для задачи, однако кажется, что он генерирует довольно большой список строк и сохраняет их все в памяти сразу перед обработкой.

При запуске приведенного ниже кода в течение примерно 5 минут в командной строке сама командная строка занимает более 4 ГБ памяти, которую, как мне кажется, можно значительно уменьшить.

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

#!/bin/env/python
import itertools
import string
import hashlib

def stringGen(charset, maxlength):
    return (''.join(candidate)
        for candidate in itertools.chain.from_iterable(itertools.product(charset, repeat=i)
        for i in range(1, maxlength + 1)))
i=0        
for attempt in stringGen(string.ascii_lowercase, 10):
    i+=1
    aHash = hashlib.sha256(attempt).hexdigest()
    print attempt
    print aHash + " " + str(i) + "\n"
    if aHash == hashlib.sha256("longword").hexdigest():
        print "matched" 
        break

person DCIndieDev    schedule 15.05.2014    source источник
comment
Кажется, вы ищете выражения генератора.   -  person devnull    schedule 15.05.2014
comment
itertools — это функции, создающие итераторы для эффективного выполнения циклов. Вы уверены, что они все хранят в памяти? Мы не можем сказать, потому что вы не показали никакого кода.   -  person Jonathon Reinhart    schedule 15.05.2014
comment
Записывайте каждую строку как строку в файле, а не в массиве. Если он находится в массиве, он находится в памяти.   -  person Vasili Syrakis    schedule 15.05.2014
comment
Хорошо, я загрузил свой код и немного изменил текст. Спасибо за невероятно быстрые комментарии по этому поводу. Надеюсь, это поможет. На самом деле мне неясно, съедается ли память из itertools. Что я знаю, так это то, что выполнение этого в течение 5 минут съедает 4 ГБ оперативной памяти, поступающей от терминального процесса.   -  person DCIndieDev    schedule 15.05.2014
comment
Возможно, вы как-то отключили сборку мусора? Когда я запускаю этот скрипт, объем памяти очень мал.   -  person roippi    schedule 15.05.2014
comment
Я никогда не отключал его намеренно, но, думаю, это возможно. Вы проверяете память python или командную строку, в которой работает python?   -  person DCIndieDev    schedule 15.05.2014
comment
Я использую top. Так что проверка памяти на все, на самом деле. И замечу, как написано, ваша программа правильно использует генераторы, поэтому все строки генерируются на лету. Проблема должна быть в другом.   -  person roippi    schedule 15.05.2014
comment