将numpy数组设置为None free memory?

时间:2016-02-10 13:34:28

标签: python arrays numpy memory-management memory-leaks

我有数百个非常大的矩阵,如(600,800)或(3,600,800)个形状的矩阵。

因此,我想在我不再需要的时候尽快取消分配使用的内存。

我想:

some_matrix = None

应该完成这项工作,还是只是将参考设置为无但在内存中的某个地方仍然分配了空间? (比如保留分配的空间以便将来重新初始化some_matrix

此外:有时我正在切片矩阵,计算一些东西并将值放入缓冲区(列表,因为它会一直追加)。因此,将列表设置为None肯定会释放内存,对吧?

或者是否存在某种unset()方法,其中整个标识符及其引用的对象被“删除”?

3 个答案:

答案 0 :(得分:18)

你肯定想看看garbage collection。与C/C++之类的编程语言不同,程序员必须在不再需要空间时自行释放动态分配的内存,python有一个垃圾收集。这意味着python本身在necessary时释放内存。

使用some_matrix = None时,将变量与内存空间取消链接;引用计数器减少,如果它达到0,垃圾收集器将释放内存。 当您使用MSeifert建议的del some_matrix时,内存不会立即释放,而不是答案所说的内容。根据{{​​3}},这是发生的事情:

  

删除名称会删除该名称与本地或全局名称空间的绑定

引擎盖下发生的事情是,内存空间的引用计数器减少1,与分配None或使用del无关。当此计数器达到0时,垃圾收集器将来free将占用内存空间。唯一的区别是,当使用del时,从上下文中可以清楚地看出,您不再需要该名称了。

如果您查看垃圾收集的文档,您将看到您可以自己调用它或更改其某些参数。

答案 1 :(得分:7)

Numpy在引用计数器为零时删除数组(或者至少跟踪引用计数器并让操作系统收集垃圾)。

例如

import numpy as np
a = np.linspace(0,100, 10000000)
a = None

将立即“释放”内存(首选方式是写del a)而

import numpy as np
a = np.linspace(0,100, 10000000)
b = a
a = None

将一无所获。

你提到过切片。切片只是数据的一个视图,因此与第二个示例完全相同。如果不删除引用同一阵列的两个变量,操作系统将保留数组。

如果我做了非常昂贵的事情,我将始终坚持执行操作的单独功能,并且只返回真正需要的内容。函数自行清理,因此释放任何中间结果(如果没有返回)。

答案 2 :(得分:0)

如果您必须执行以下操作,尽管将隐式创建a的副本,则将不会释放以下内存:

a = np.ones((10000, 10000))
b = np.empty((10000, 10000))
b[:] = a
a = None
del a

相反,您可以执行以下操作,并且在执行a = None后将释放内存:

a = np.ones((10000, 10000))
b = np.empty((10000, 10000))
b[:] = np.copy(a)
a = None
del a