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,从上下文中可以清楚地看出,您不再需要该名称.
如果您查看垃圾收集的文档,您将看到您可以自己调用它或更改它的一些参数.
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)
什么都不会.
你提到了切片.切片只是数据的一个视图,因此与第二个示例完全相同.如果不删除引用同一阵列的两个变量,操作系统将保留阵列.
如果我做了一些非常昂贵的内存,我将始终坚持执行操作的单独功能,并且只返回真正需要的内容.函数自行清理,因此释放任何中间结果(如果没有返回).
| 归档时间: |
|
| 查看次数: |
21404 次 |
| 最近记录: |