0

我有一个用 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

4 回答 4

1

以前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()调用 Guppy 都会输出类似的内容。

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.logfgrep 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 Lion 上安装 guppy pip install https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy

总之,我不认为这是内存不足的问题,尽管我们没有使用完整的 OP 数据集。

于 2013-02-03T13:48:54.057 回答
0

正如您现在所知道的,您的程序将非常有效地自行运行。但是请确保您不只是在 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)
于 2013-02-03T18:24:05.917 回答
0

IronPython和 Visual Studio 用于其调试工具(非常好)怎么样?您应该能够暂停执行并查看内存(本质上是内存转储)。

于 2013-02-03T13:04:39.810 回答
0

如果您希望文件输出到记事本,要回答@shaun 的上述评论,只需像这样运行您的文件

我的文件.py >输出.txt

如果文本文件不存在,它将被创建。

编辑:

替换底部代码中的行:

print "" .join(item)

有了这个:

with open ("output.txt","a") as f:
    f.write('\n'.join(items))
f.close

这将生成一个名为 output.txt 的文件。应该工作(尚未测试)

于 2013-02-03T13:47:35.870 回答