python中的动态内存分配

fre*_*ude 7 python memory ram numpy

我创建了一个大的多维数组Mnp.zeros((1000,1000)).经过一定数量的操作后,我不再需要了.如何在程序执行期间动态释放RAM?是否M=0为我做呢?

Rol*_*ith 16

一般你不能.即使你删除了对象的所有引用,它仍然留给python实现来重用或释放内存.在CPython上,您可以调用gc.collect()强制执行垃圾收集.但是虽然这可能会回收内存,但它并不一定会将其返回给操作系统.

但是:numpy是一个扩展模块,可以完成自己的工作,并管理自己的内存.

当我监视python进程的内存使用情况时,我看到RAM使用率(Resident Set Size)之后会下降 del(M)

In [1]: import numpy as np

In [2]: M = np.zeros((1000,1000))

In [3]: del(M)

In [4]: 
Run Code Online (Sandbox Code Playgroud)

刚刚启动IPython之后:

slackbox:~> ps -u 77778
USER     PID %CPU %MEM    VSZ   RSS TT  STAT STARTED    TIME COMMAND
rsmith 77778  0.0  0.5 119644 22692  0  S+    2:37PM 0:00.39 /usr/local/bin/py
Run Code Online (Sandbox Code Playgroud)

导入numpy(1)后:

slackbox:~> ps -u 77778
USER     PID %CPU %MEM    VSZ   RSS TT  STAT STARTED    TIME COMMAND
rsmith 77778  1.0  0.8 168548 32420  0  S+    2:37PM 0:00.49 /usr/local/bin/py
Run Code Online (Sandbox Code Playgroud)

创建数组后(2):

slackbox:~> ps -u 77778
USER     PID %CPU %MEM    VSZ   RSS TT  STAT STARTED    TIME COMMAND
rsmith 77778  0.0  1.0 176740 40328  0  S+    2:37PM 0:00.50 /usr/local/bin/py
Run Code Online (Sandbox Code Playgroud)

致电del(3)后:

slackbox:~> ps -u 77778
USER     PID %CPU %MEM    VSZ   RSS TT  STAT STARTED    TIME COMMAND
rsmith 77778  0.0  0.8 168548 32496  0  S+    2:37PM 0:00.50 /usr/local/bin/py
slackbox:~> 
Run Code Online (Sandbox Code Playgroud)

因此在这种情况下使用del()可以减少使用的RAM量.

请注意,numpy有一个例外.Numpy可以使用另一个扩展库分配的内存.在这种情况下,numpy对象被标记为numpy不拥有内存,释放它将留给另一个库.