当变量超出范围时,Python不释放内存

时间:2018-04-25 00:18:54

标签: python numpy memory

当我在函数内初始化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)

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

实际上,只要函数完成,Python就会释放内存。这里的问题是您打印的值resource.getrusage(resource.RUSAGE_SELF).ru_maxrss会告诉您峰值或 max 内存使用情况。

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

尝试使用此修改后的代码段:

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的帮助下达到了新的高度。此时,当前使用量是新的最大值,因此两个值都匹配。

离开这个功能后,我们当前的使用率会下降到我们进入功能之前的大致位置。