Я пытаюсь написать программу, которая генерирует строки одну за другой в разных комбинациях (начиная с «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
itertools
— это функции, создающие итераторы для эффективного выполнения циклов. Вы уверены, что они все хранят в памяти? Мы не можем сказать, потому что вы не показали никакого кода. - person Jonathon Reinhart   schedule 15.05.2014top
. Так что проверка памяти на все, на самом деле. И замечу, как написано, ваша программа правильно использует генераторы, поэтому все строки генерируются на лету. Проблема должна быть в другом. - person roippi   schedule 15.05.2014