【问题标题】:Python does not free memory when variable goes out of scope当变量超出范围时,Python 不会释放内存
【发布时间】:2018-10-05 08:18:45
【问题描述】:

当我在函数内初始化 Numpy 数组时,Python 不会在函数返回后释放内存,如下面的代码示例所示。有什么办法可以释放这个内存吗?使用 gc.collect() 不起作用,在 Python2 和 Python3 中也会出现同样的问题。

import numpy as np
import resource

def function():
    x = np.random.random([10000, 10000])

print('Memory usage: %s (kb)'% resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)

function()

print('Memory usage: %s (kb)'% resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)

代码输出:
内存使用量:20560 (kb)
内存使用量:801832 (kb)

【问题讨论】:

  • 函数后面需要用到numpy数组吗?
  • 我知道某处有重复。现在,请阅读以下内容:effbot.org/pyfaq/…
  • 另请注意 gc 在这里完全不相关,没有任何引用周期,因此内存由简单的引用计数管理(当然是在 CPython 中)

标签: python numpy memory


【解决方案1】:

Python 实际上是在函数完成后立即释放内存。这里的问题是您打印出来的值resource.getrusage(resource.RUSAGE_SELF).ru_maxrss 告诉您峰值或max 内存使用量。

要获取当前内存使用情况,您可以尝试psutil 包 ($ pip install psutil)。它是一个跨平台实用程序,可为您提供当前内存使用情况等信息。

试试这个修改后的 sn-p:

import numpy as np
import resource
import os
import psutil

process = psutil.Process(os.getpid())

def my_function():
    print('### Starting function ###')
    print('Max  Memory usage: %s (KB)' % resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
    print('Curr Memory usage: %s (KB)' % (process.memory_info().rss / 1024))
    print('doing stuff...')
    x = np.random.random([10000, 10000])
    print('Max  Memory usage: %s (KB)' % resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
    print('Curr Memory usage: %s (KB)' % (process.memory_info().rss / 1024))
    print('#### Ending function ####')

print('Max  Memory usage: %s (KB)'% resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
print('Curr Memory usage: %s (KB)'% (process.memory_info().rss/ 1024))

my_function()

print('Max  Memory usage: %s (KB)'% resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
print('Curr Memory usage: %s (KB)'% (process.memory_info().rss / 1024))

在我的机器上,输出如下:

Max  Memory usage: 714588 (KB)
Curr Memory usage: 26884.0 (KB)
### Starting function ###
Max  Memory usage: 714588 (KB)
Curr Memory usage: 26884.0 (KB)
doing stuff...
Max  Memory usage: 808380 (KB)
Curr Memory usage: 808380.0 (KB)
#### Ending function ####
Max  Memory usage: 808380 (KB)
Curr Memory usage: 27132.0 (KB)

当我们进行第一次内存检查时,它已降至 26 MB,但在启动或导入库时的某个时间点已高达 714 MB。

在函数开始时是一样的,但在函数结束时,我们在 numpy 的帮助下达到了一个新的高度。此时当前使用量是新的最大值,因此两个值匹配。

在我们离开函数后,我们当前的使用量会回落到进入函数之前的大致水平。

【讨论】:

    【解决方案2】:

    Python 可以选择不向操作系统释放垃圾收集的内存。它可能会保留已分配的内存以供将来使用。这并不意味着存在内存泄漏。

    【讨论】:

    • 有什么方法可以禁用/控制它吗?
    猜你喜欢
    • 2012-12-03
    • 2010-11-22
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    相关资源
    最近更新 更多