使用Python进行内存转储

使用Python进行内存转储,python,memory-management,itertools,prefixes,Python,Memory Management,Itertools,Prefixes,我用Python为我编写了一个小程序,帮助我从我知道的一组不同的数字和单词中生成所有密码组合,以恢复我忘记的密码,因为我知道我使用的所有不同的单词和数字集,我只想生成所有可能的组合,唯一的问题是,这个列表似乎持续了好几个小时,所以最终我的内存用完了,它没有完成 我被告知它需要转储我的内存,这样它才能继续,但我不确定这是否正确。有什么办法可以解决这个问题吗 这是我正在运行的程序: #!/usr/bin/python import itertools gfname = "name" tendig =

我用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)
出于明显的原因,我拿出了几套,修改了数字和单词,但这基本上就是程序

另一件事是我可能遗漏了一个特定的单词,但我不想把它放在列表中,因为我知道它可能在所有生成的密码之前,有人知道如何在我的程序中添加前缀吗


很抱歉语法不好,感谢您提供的帮助。

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

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

Myfile.py>output.txt

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

编辑:

将代码底部的行替换为:

print "" .join(item)
为此:

with open ("output.txt","a") as f:
    f.write('\n'.join(items))
f.close
这将生成一个名为output.txt的文件。
应该可以工作(尚未测试)

我使用了
guppy
来了解内存使用情况,我稍微更改了操作代码(标记为#!!)

每次调用
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.log
并显示
fgrep分区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-MountainLion上安装guppy
pip安装https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy


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

正如您现在所知,您的程序将非常高效地自行运行。但要确保你不只是在空闲状态下运行它,例如;这将使其速度减慢到爬行速度,因为空闲会用越来越多的行更新屏幕。将输出直接保存到文件中

更好的是:你有没有想过当你有了密码后会怎么做?如果您可以从命令行登录到丢失的帐户,请尝试立即登录,而不是存储所有密码供以后使用:

for length in range(1, len(mylist)+1):
    for item in itertools.permutations(mylist, length):
        password = "".join(item)
        try_to_logon(command, password)

此程序不会耗尽内存,除非您的计算机内存非常少。事实上,这是相当有效的。我有8吉格的内存,但请记住,我已经取出了几组单词和数字。这里显示的代码要么在显示最长可能的组合时或之前耗尽内存,要么根本没有。最长的组合占用(在我的64位机器上)110字节的内存。整个程序最多需要数千字节的内存,而不是千兆字节。当然,要完成所有可能的排列需要很长时间。您希望找到一个可以停止并在另一个时间继续的点,但不需要内存转储。你需要理解这个程序的功能,并找到划分它的方法。哦,对了,我知道了,我不熟悉编程。我不明白为什么我的内存不足,我让它生成密码好几个小时,但在它完成之前就停止了,所以我复制并粘贴了列表到记事本中,创建了一个49MB的文件。如果我留了一夜,我已经这么做了,我的电脑冻结了,并且有消息说我的内存不足。谢谢你的建议,我会研究一下,但我确实认为我需要学习一点编程知识。周围有很多python教程,python现在很流行:)但当我是一个完全的初学者时,我需要接受很多东西,特别是理解我的程序。有没有办法让我的程序将结果粘贴到记事本中?对不起,如果这是一个愚蠢的问题。对不起,我不知道该把那条线放在哪里。没问题。从命令行运行文件时,您不会将其添加到实际代码中,而是添加了>output.txt。这样做就是告诉windows将输出推送到文本文件(记事本)而不是屏幕上。另一种方法是更改代码以替换行print“”。用代码连接(项)以打开文本文件并写入该文件。有很多关于堆栈溢出或google的例子。我在手机上写这篇文章,所以写代码对我来说很困难。哦,对了,我明白了,谢谢你向我解释,我相信经过一点研究后我能做到:)没问题,肖恩。当我明天到办公室时,我会修改你的代码,将其输出到一个文件中,而不需要>输出。TXT非常感谢你,保罗,我下班后会尝试一下。这完全超出了我的想象,对不起,我不明白你做了什么,我对编程一无所知。你看:(我只是想说明,您的代码不会出现内存不足的情况,因为每次执行另一个
itertools.permutations(…)时,我都会转储使用的内存。)
而且内存占用似乎没有太大变化。正如建议的那样,从CMD窗口执行
python yourcode.py>youlog.txt
应该可以运行没有问题的代码。如果确实有问题,请尝试并报告。我在晚上再次运行了我的代码,并且我一直在检查它,结果还可以,但是
for length in range(1, len(mylist)+1):
    for item in itertools.permutations(mylist, length):
        password = "".join(item)
        try_to_logon(command, password)