当我在函数内初始化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)
答案 0 :(得分:1)
Python可以选择不向操作系统发布垃圾收集内存。它可以保留已分配的内存以供将来使用。这并不意味着存在内存泄漏。
答案 1 :(得分:1)
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的帮助下达到了新的高度。此时,当前使用量是新的最大值,因此两个值都匹配。
离开这个功能后,我们当前的使用率会下降到我们进入功能之前的大致位置。