Python进程内存随时间增长

9 投票
2 回答
4890 浏览
提问于 2025-04-16 00:18

我的Python代码在处理内存时会动态增加,因为它在需要的时候会把动态数据存储在列表、字典和元组里。虽然这些动态数据在之后会在它们的变量中被清除,但内存并没有下降。

因此,我觉得可能存在内存泄漏,于是我使用了gc.collect()方法来回收所有未释放的内存。但是,即使在变量中没有数据时,我也无法将内存降到最低。

2 个回答

0

我们说的内存占用有多大呢?Python本身会占用一些内存,大概在30到40MB左右。如果占用的内存超过这个范围,而且没有被释放,那就说明你可能有内存泄漏。只有那些没有任何引用的垃圾数据才能被清理掉,看来你的多余数据还是被某些地方引用着。你可以做个内存分析,看看具体发生了什么。

12

一般来说,进程很难“把内存还给操作系统”,因为在进程结束之前,操作系统无法收回所有的内存。大多数情况下,malloc 返回的内存是从大块内存中划分出来的,为了提高效率。如果这块内存的某一部分还在使用中,就不能把整个块还回去。因此,大多数 C 标准库根本不尝试这么做。

如果想了解 Python 中的相关讨论,可以参考 这里。Evan Jones 修复了一些 Python 特有的问题,具体可以看 这里这里。他的修复从 Python 2.5 开始就已经包含在主版本中,所以你遇到的问题肯定是出在系统的 malloc 包,而不是 Python 本身。关于 2.6 的具体解释可以参考 这里这里

在一个 SO 讨论串中,这里,Hugh Allen 在他的回答中引用了 Firefox 程序员的话,指出在 Mac OS X 系统中,进程基本上不可能把内存还给操作系统。

所以,只有在终止进程时,才能确保释放它的内存。例如,一个长时间运行的服务器可以定期将其状态快照保存到磁盘,然后关闭(可以有一个小的监控进程,无论是系统自带的还是自定义的,来监控并重启它)。如果你知道接下来的操作会短时间内占用大量内存,通常可以使用 os.fork,在子进程中进行内存密集型的工作,然后在子进程结束时通过管道将结果(如果有的话)返回给父进程。依此类推。

撰写回答