#python #memory-management #multiprocessing
#python #управление памятью #многопроцессорная обработка
Вопрос:
Я создаю многопроцессорный процесс для взломщика паролей, и в последний раз, когда я его запускал, мой компьютер буквально умер. Есть ли какой-либо способ предотвратить это? Объем используемой памяти достиг 100%, и мой компьютер завис. Мне нужно запустить несколько процессов, чтобы разные программы могли одновременно проверять часть догадок. Это сработало бы, если бы у меня было больше памяти, но если у кого-нибудь есть какие-либо решения, пожалуйста, скажите об этом.
import hashlib
import itertools
import time
flag2=0
def getpass(comb, usechar, pass_hash):
global flag2
st = time.time()
for guess in comb:
guess = ''.join(guess)
digest = hashlib.md5(guess.encode('utf-8').strip()).hexdigest()
if digest == pass_hash:
print("password is: " guess)
flag2=1
print("Time Completed(seconds): " str(time.time() - st))
break;
if flag2==1:
break;
if __name__ == '__main__':
from multiprocessing import Process
flag = 0
lower = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
upper = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
nums = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
char = ["~", "`", "!", "@", "#", "$", "%", "^", "amp;", "*", "(", ")", "_", "-", " ", "=", "[", "]", "{", "}", ":", ";", "'", """, "\", "|", ",", ".", "<", ">", "?", "/"]
pass_hash = input("Enter md5 hash: ")
#a=all, l=letters, n=numbers
pass_type = input(str("Enter Password Type: "))
usechar = []
processes = []
if pass_type == "a":
usechar = nums lower upper char
elif pass_type == "l":
usechar = lower upper
elif pass_type == "n":
usechar = nums
else:
usechar = nums lower upper char
try:
pass_file = open("Passwords.txt", "r")
print("Accessing Passwords")
except:
print("No file found")
quit()
st = time.time()
for word in pass_file:
enc_word = word.encode('utf-8')
digest = hashlib.md5(enc_word.strip()).hexdigest()
if digest == pass_hash:
print("Password found")
print("Password is " word)
print("Time Completed(seconds): " str(time.time() - st))
flag = 1
break
if flag == 0:
print("Password is not in the list. Using brute-force")
for password_length in range(1, 20):
processes = []
comb = itertools.product(usechar, repeat=password_length)
thr = 0
leng = 0
for i in range(1,20):
leng = len(usechar)^i
for i in range(0,2):
processes.append(Process(target=getpass, args=[list(comb)[thr:round(leng/2) thr], usechar, pass_hash]))
thr =round(leng/2)
for process in processes:
process.start()
for process in processes:
process.join()
if flag2==0:
print("password is over 20 characters long")
Ответ №1:
Во-первых, переменная comb
представляет собой чрезвычайно длинный список, и вы передаете фрагменты этого необычайно длинного списка каждому из ваших подпроцессов. Вероятно, именно сюда уходит вся ваша память.
Вероятно, было бы разумнее использовать пул потоков определенного размера и создавать несколько фрагментов работы на основе первых двух букв текста. Затем каждый рабочий сгенерирует все пароли с этими первыми двумя буквами (как генератор, а не как полностью развернутый список) и посмотрит, что они найдут. Вы обнаружите, что вам вообще не нужно много памяти.
Вот краткий обзор, прерывающийся только на первом символе.
def worker(start_character):
for length in range(1, max_length):
for password_suffix in itertools.product(usechar, length - 1)
password = start_character password_suffix
......
with multiprocessing.Pool() as pool:
pool.map(cracker, usechar)
Каждый поток практически не использует память вообще. Вы можете использовать столько потоков, сколько процессоров на вашем компьютере.
Комментарии:
1. Когда вы используете карту, под взломщиком вы подразумеваете работника?
2. ДА. Я называл своих работников «взломщиком». Поскольку они взламывали пароли.
3. Что именно делает pool.map? Позволяет ли это рабочим указывать основные значения скрипта?
4. pool.map создает несколько потоков, вызывая
cracker
каждый из элементов в спискеusechar
. Это пул потоков, который ограничивает количество потоков количеством процессоров. Когда каждая часть завершена, она отправляет потоку следующую часть.