完成后,Python程序不会退出

时间:2010-03-09 21:29:48

标签: python linux memory-leaks

我有以下脚本186.py:

S=[]
study=set([524287])

tmax=10**7
D={}
DF={}
dudcount=0
callcount=0

def matchval(t1,t2):
    if t1==t2:
        global dudcount
        dudcount+=1
    else:
        global callcount
        callcount+=1
        D.setdefault(t1,set([]))
        D.setdefault(t2,set([]))
        D[t1].add(t2)
        if t1 in D[t2]:
            DF.setdefault(t1,set([]))
            DF[t1].add(t2)
            DF.setdefault(t2,set([]))
            DF[t2].add(t1)

for k in xrange(27):
    t1=(100003 - 200003*(2*k+1) + 300007*(2*k+1)**3)%(1000000)
    S.append(t1)
    t2=(100003 - 200003*(2*k+2) + 300007*(2*k+2)**3)%(1000000)
    S.append(t2)
    matchval(t1,t2)

t1=(100003 - 200003*(55) + 300007*(55)**3)%(1000000)
S.append(t1)
t2=(S[31]+S.pop(0))%(1000000)
S.append(t2)
matchval(t1,t2)

for k in xrange(29,tmax+1):
    t1=(S[31]+S.pop(0))%(1000000)
    S.append(t1)

    t2=(S[31]+S.pop(0))%(1000000)
    S.append(t2)
    matchval(t1,t2)

D.setdefault(524287,set([]))
DF.setdefault(524287,set([]))
print D[524287]
print DF[524287]
print dudcount,callcount
print "Done"

最后一行打印“完成”,但发生这种情况时python不会退出。我输入以下命令:

$ time python 186.py

得到结果:

set([810528L, 582178L, 49419L, 214483L, 974071L, 651738L, 199163L, 193791L])
set([])
11 9999989
Done

但是我必须按ctrl + C才能得到时间:

real    34m18.642s
user    2m26.465s
sys     0m11.645s

程序输出“完成”之后python CPU使用率很小......但内存使用量持续增长...一旦达到系统内存的80%(旧系统),我使用了ctrl + C

这里发生了什么?打印完成后程序正在做什么?不应该这样做吗?

谢谢, 丹

2 个答案:

答案 0 :(得分:7)

我在配备2GB RAM的2 GHz双核笔记本电脑上运行了相同的代码,在Cygwin中花了大约1 1/2分钟。在程序退出之前,内存使用量增加了超过600 MB,并且在Done出现之后大约需要2-4秒才能出现提示并释放内存。但是,Done出现后我没有看到任何内存增加。

我的猜测是它与内存管理有关。在出现Done之后,Python正在努力释放所有内存,这些内存可能需要很长时间才能在RAM较少的旧机器上运行。我不确定为什么内存实际上会增加,除非有任何告诉你正在使用多少内存的延迟。

答案 1 :(得分:0)

没有任何迹象表明您发布的内容符合描述的症状。也许执行代码中的缩进是填充的,你真的要围绕整个堆运行另一个循环。请注意,只有勇敢的人才会在需要34分钟的时间内尝试重现您的问题。你能在更短的时间内重现这个问题吗?

当你做Control-C时,追溯说了什么?

在任何情况下,我强烈建议不要在整个地方使用硬编码常量(?),例如524287 ....给它一个有意义的名字并在开始时做meaningful_name = 524287。或者,如果它确实是一个变量,请通过sys.argv.

输入