Дамп памяти с использованием Python
У меня есть небольшая программа, написанная для меня на Python, чтобы помочь мне сгенерировать все комбинации паролей из разных наборов цифр и слов, которые я знаю, чтобы восстановить пароль, который я забыл, так как я знаю все разные слова и наборы цифр, которые я использовал, я просто хотел генерировать все возможные комбинации, единственная проблема в том, что список, кажется, продолжается часами и часами, так что в итоге у меня заканчивается память, и она не заканчивается.
Мне сказали, что нужно сбросить память, чтобы она могла продолжаться, но я не уверен, правильно ли это. Есть ли способ обойти эту проблему?
это программа, которую я запускаю:
#!/usr/bin/python
import itertools
gfname = "name"
tendig = "1234567890"
sixteendig = "1111111111111111"
housenum = "99"
Characterset1 = "&&&&"
Characterset2 = "££££"
daughternam = "dname"
daughtyear = "1900"
phonenum1 = "055522233"
phonenum2 = "3333333"
mylist = [gfname, tendig, sixteendig, housenum, Characterset1,
Characterset2, daughternam, daughtyear, phonenum1, phonenum2]
for length in range(1, len(mylist)+1):
for item in itertools.permutations(mylist, length):
print "".join(item)
Я вынул несколько комплектов и изменил цифры и слова по понятным причинам, но это примерно программа.
Другое дело, что я могу пропустить определенное слово, но не хочу помещать его в список, потому что я знаю, что оно может идти раньше всех сгенерированных паролей, кто-нибудь знает, как добавить префикс в мою программу.
извините за плохую грамматику и спасибо за любую помощь, оказанную.
4 ответа
Я использовал guppy
Чтобы понять использование памяти, я немного изменил код OP (помеченный #!!!)
import itertools
gfname = "name"
tendig = "1234567890"
sixteendig = "1111111111111111"
housenum = "99"
Characterset1 = "&&&&"
Characterset2 = u"££££"
daughternam = "dname"
daughtyear = "1900"
phonenum1 = "055522233"
phonenum2 = "3333333"
from guppy import hpy # !!!
h=hpy() # !!!
mylist = [gfname, tendig, sixteendig, housenum, Characterset1,
Characterset2, daughternam, daughtyear, phonenum1, phonenum2]
for length in range(1, len(mylist)+1):
print h.heap() #!!!
for item in itertools.permutations(mylist, length):
print item # !!!
Гуппи выводит что-то подобное каждый раз h.heap()
называется.
Partition of a set of 25914 objects. Total size = 3370200 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 11748 45 985544 29 985544 29 str
1 5858 23 472376 14 1457920 43 tuple
2 323 1 253640 8 1711560 51 dict (no owner)
3 67 0 213064 6 1924624 57 dict of module
4 199 1 210856 6 2135480 63 dict of type
5 1630 6 208640 6 2344120 70 types.CodeType
6 1593 6 191160 6 2535280 75 function
7 199 1 177008 5 2712288 80 type
8 124 0 135328 4 2847616 84 dict of class
9 1045 4 83600 2 2931216 87 __builtin__.wrapper_descriptor
Бег python code.py > code.log
и fgrep Partition code.log
показывает.
Partition of a set of 25914 objects. Total size = 3370200 bytes.
Partition of a set of 25924 objects. Total size = 3355832 bytes.
Partition of a set of 25924 objects. Total size = 3355728 bytes.
Partition of a set of 25924 objects. Total size = 3372568 bytes.
Partition of a set of 25924 objects. Total size = 3372736 bytes.
Partition of a set of 25924 objects. Total size = 3355752 bytes.
Partition of a set of 25924 objects. Total size = 3372592 bytes.
Partition of a set of 25924 objects. Total size = 3372760 bytes.
Partition of a set of 25924 objects. Total size = 3355776 bytes.
Partition of a set of 25924 objects. Total size = 3372616 bytes.
Как я полагаю, это показывает, что объем памяти остается достаточно постоянным.
Конечно, я могу неверно истолковать результаты guppy
, Хотя во время моих тестов я сознательно добавил новую строку в список, чтобы увидеть, увеличилось ли количество объектов, и это произошло.
Для интересующихся мне пришлось установить гуппи как на OSX - Mountain Lionpip install https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy
Итак, я не думаю, что это проблема нехватки памяти, хотя мы не используем полный набор данных OP.
Чтобы ответить на комментарий выше @shaun, если вы хотите, чтобы файл выводился в блокнот, просто запустите ваш файл так
Myfile.py >output.txt
Если текстовый файл не существует, он будет создан.
РЕДАКТИРОВАТЬ:
Замените строку в вашем коде внизу, которая гласит:
print "" .join(item)
с этим:
with open ("output.txt","a") as f:
f.write('\n'.join(items))
f.close
который создаст файл с именем output.txt. Должен работать (не проверял)
Как насчет использования IronPython и Visual Studio для его инструментов отладки (которые довольно хороши)? Вы должны быть в состоянии приостановить выполнение и посмотреть на память (по сути, дамп памяти).
Ваша программа будет работать довольно эффективно сама, как вы теперь знаете. Но убедитесь, что вы не просто запустите его в IDLE, например; это замедлит его до сканирования, поскольку IDLE обновляет экран все большим количеством строк. Сохраните вывод непосредственно в файл.
Еще лучше: вы думали о том, что вы будете делать, когда у вас есть пароли? Если вы можете войти в утерянную учетную запись из командной строки, попробуйте сделать это немедленно, вместо того, чтобы хранить все пароли для дальнейшего использования:
for length in range(1, len(mylist)+1):
for item in itertools.permutations(mylist, length):
password = "".join(item)
try_to_logon(command, password)