随着时间推移Python进程内存不断增长

9

我的Python代码在需要时使用列表、字典和元组存储动态数据,导致进程内存动态增长。虽然这些动态数据在变量中被清除,但是内存并没有降下来。

因此,我认为存在内存泄漏,并使用gc.collect()方法收集所有未释放的内存。但是,即使变量中没有数据,我也无法将内存降至最低。


你为什么认为它会下降?你使用的是哪个操作系统?在许多操作系统中,一旦进程获取了内存,该进程就会保持原样。 - S.Lott
我正在使用Mac OSX 10.5,我相信在后期它会占用更多的空间。 目前它已经从最初的24MB增长了约15MB。 我相信进程内存应该以MB为单位增长,这可能会影响可用内存大小。 - herby
2个回答

12
通常情况下,一个进程很难“将内存归还给操作系统”(当然,直到进程终止并操作系统收回所有内存时),因为(在大多数实现中)malloc返回的内容是从大块中切割出来的,以提高效率,但如果该块的任何部分仍在使用中,则整个块无法返回--所以,大多数C标准库甚至不尝试。
关于Python的讨论可参见这里。Evan Jones修复了一些Python特定的问题,如这里这里所述,但他的补丁自Python 2.5以来已经在主干中,所以你观察到的问题肯定与系统的malloc包有关,而与Python本身无关。有关版本2.6的说明请参见这里这里
这里的一条SO线程中,Hugh Allen在他的答案中引用了Firefox程序员的话,指出Mac OS X是一个基本上“不可能”将内存返回给操作系统的系统。

所以,只有通过终止进程才能确保释放其内存。例如,一个长时间运行的服务器可以定期将其状态快照保存到磁盘并关闭(同时有一个小的看门狗进程,系统或自定义,监视它并重新启动它)。如果您知道下一次操作将花费大量的内存但时间很短,通常可以使用 os.fork 在子进程中执行需要大量内存的工作,并在子进程终止时通过管道将结果(如果有)返回给父进程。等等。


0

我们需要考虑的是多大的内存?Python本身占用一定量的内存,可能高达30到40 MB。如果它比这还要大,并且没有被回收,那么你就有了内存泄漏。只有没有引用的垃圾才能被回收,但你的额外内容仍然被引用。进行内存分析,看看发生了什么。


目前,它从最初的24MB增长了约15MB,以适应最小场景。然而,我尝试了下面的链接工具,发现所引用的数据不超过3MB。我无法获取剩余内存详细信息。 - herby
那不是很大的问题。如果你在寻找一个超低内存的程序,通常你不会用Python编程。大多数电脑都有2-4GB的内存,15MB不值得担心。 - bwawok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接