如何克服python中的“内存错误”?

问题描述 投票:0回答:2

我已经制作了一个基本的密码破解程序,该程序告诉用户基本的命中和试用算法可以在什么时间破解他们的密码。但是,在运行该程序时遇到了存储错误,我还尝试添加所有内容。数据到sqlite文件,但也无法正常工作。请帮助我。

我的代码:

from random import *
import time
import itertools
from string import *

class password_cracker():

    result = 0
    pswd_db = []

    def __init__(self,n):
        self.n  = n
    def input_phase(self):
       self.n = input("Password: ")
    def cracker(self):
        data_stock = ascii_letters + digits + punctuation
        pswd = ''
        combs = list(itertools.permutations(data_stock, 6))  #I am getting the error here
        start = time.time()
        for byts in combs:
            for bits in byts:
                pswd += bits
            pswd_db.append(pswd)
            if pswd == self.n:
                result = 1
                break
            else:
                result = 0
            pswd = ''
        end = time.time()
        total_time = end - start


    def final_result(self):
        if result == 0:
            print('You have got an exceptional password!')
        else:
            print('Password cracked in ', total_time)

 n =  password_cracker("")
 n.cracker()  

在控制台中:

追踪(最近通话):文件“ c:/ Users / Soumodeep Bhowmick / Desktop / CS.IP / pws.py”,第93行,在n.cracker()文件“ c:/ Users / Soumodeep Bhowmick / Desktop / CS.IP / pws.py”,第59行,在cracker中梳=列表(itertools.permutations(data_stock,6))MemoryError

python out-of-memory
2个回答
1
投票
list调用将整个6元素字符串列表带入内存。您应该只可以删除list呼叫:

combs = itertools.permutations(data_stock, 6) for comb in combs: ...

这将仅在需要时生成每个排列-一次仅将一个存储在内存中。根据经验,ittools模块中的内容自然会返回迭代器,这些迭代器设计为供for循环使用。

0
投票
在那一行:

combs = list(itertools.permutations(data_stock, 6))

您要获取data_stock的所有长度6个排列的列表(94个字符长)。因此,这是一个长度为6个字符的94 ^ 6(或94!/ 88 !,如果您希望组合的话)的列表。或者,简单地说,列出6个字符的689,869,781,056或586,236,072,240个字符串。

如果改为使用迭代器,则不会耗尽内存,但是脚本将忙一会儿...您可能希望完全考虑另一种方法。

© www.soinside.com 2019 - 2024. All rights reserved.