将numpy数组设置为None free memory?

dan*_*451 17 python arrays memory-leaks memory-management numpy

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

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

我想:

some_matrix = None
Run Code Online (Sandbox Code Playgroud)

应该做的工作,还是只是将引用设置为None但是在Memory的某个地方仍然分配了空间?(比如为some_matrix将来的某些重新初始化保留分配的空间)

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

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

inn*_*SPG 20

你肯定想看看垃圾收集.与某些编程语言不同C/C++,例如程序员在不再需要空间时必须自己释放动态分配的内存,python有一个垃圾收集.这意味着python本身可以释放内存necessary.

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

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

引擎盖下发生的事情是,通过1独立于分配None或使用来减少对存储空间的引用计数器del.当这个计数器到达时0,垃圾收集器将来会free占用内存空间.唯一的区别是,在使用时del,从上下文中可以清楚地看出,您不再需要该名称.

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


MSe*_*ert 8

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

例如有

import numpy as np
a = np.linspace(0,100, 10000000)
a = None
Run Code Online (Sandbox Code Playgroud)

将"立即"(首选方式是写作del a)释放记忆

import numpy as np
a = np.linspace(0,100, 10000000)
b = a
a = None
Run Code Online (Sandbox Code Playgroud)

什么都不会.


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

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

  • 切片仅返回一个视图,因此它将保留“arr”的整个内存。在你的情况下,我会在返回 `return arr[:3].copy()` 时进行复制,以便可以释放 `arr` (至少如果你想返回中间数组的一小部分)。 (2认同)