2013-05-06 28 views
1

我确信这是一个关于python和垃圾收集的天真问题。为什么在这个python代码中内存使用量增加了?

我有一个函数在内存中创建一个大型的数据结构,然后返回一个整数。

我预计在调用该函数后,数据结构使用的内存将被释放。

但是,如果我明白下面的资源调用正在做什么(感谢这SO post),似乎并不是这样。每次调用函数时,python使用的内存总量都会增加。 (我使用Python 2.7.1。)

import resource 
import random 
def r(n): 
    a = [random.randint(1,100) for i in range(1,n)] 
    return n # or sum(a) 

resource.getrusage(resource.RUSAGE_SELF).ru_maxrss 
z=r(100000) 
resource.getrusage(resource.RUSAGE_SELF).ru_maxrss 
z=r(100000) 
resource.getrusage(resource.RUSAGE_SELF).ru_maxrss 

对此我获得,例如:

81584128 
84389888 
85995520 

为什么内存使用量不断增加?

谢谢!

+0

内存释放!=内存释放。解释器可以重新使用分配给对象的内存来保留其他对象,而不必先释放它。 – Bakuriu 2013-05-06 10:26:32

+0

@Bakuriu:但在这种特殊情况下,它并不是以最佳方式重用内存。 (当我运行这个时,内存使用在第一次调用'r'之后稳定下来。) – 2013-05-06 11:52:53

+0

谢谢 - 但请参阅下面的注释 – 2013-05-07 05:37:49

回答

0

我认为这是因为每次调用函数时都会创建一个列表a。我一直以为只要函数退出,列表就会被转储并释放已用空间,但也许情况并非如此,或者不会那么快。

+1

cf Bakuriu的评论 - 列表确实在退出函数时收集垃圾,但解释器可能需要为了将来的重用保留这些内存(因为内存分配有成本),并且/甚至取消分配内存并不意味着系统立即回收它。 – 2013-05-06 11:09:49

+0

thx为澄清 – pypat 2013-05-06 12:17:25

+0

谢谢。但这里是我的问题:我在一个Web服务器上运行此功能,并在服务器上运行内存不足,即当我做 ps -o pid,pcpu,rss,命令 它显示我正在使用的内存量rss)往上走,最终服务器抱怨。有没有办法阻止这种行为?或者我误诊了这个问题? – 2013-05-07 05:35:31

相关问题