我有以下脚本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
这里发生了什么?打印完成后程序正在做什么?不应该这样做吗?
谢谢, 丹
答案 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.