我有数百个非常大的矩阵,如(600,800)或(3,600,800)个形状的矩阵。
因此,我想在我不再需要的时候尽快取消分配使用的内存。
我想:
some_matrix = None
应该完成这项工作,还是只是将参考设置为无但在内存中的某个地方仍然分配了空间? (比如保留分配的空间以便将来重新初始化some_matrix
)
此外:有时我正在切片矩阵,计算一些东西并将值放入缓冲区(列表,因为它会一直追加)。因此,将列表设置为None肯定会释放内存,对吧?
或者是否存在某种unset()
方法,其中整个标识符及其引用的对象被“删除”?
答案 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