使用Python进行内存转储

时间:2013-02-03 12:50:21

标签: python memory-management itertools prefixes

我在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 个答案:

答案 0 :(得分: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上安装孔雀鱼 - 山狮 pip install https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

Myfile.py> output.txt

如果文本文件不存在,则会创建它。

编辑:

替换底部代码中的行:

print "" .join(item)

用这个:

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

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

答案 3 :(得分: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)