[英]In python how can I make data ready for garbage collection to free memory?
我有使用numpy返回具有4个字段的数组的函数。 我在循环中使用该函数从多个来源提取数据。 但是,我的处理仅在4个字段中的1个上进行。 如何合理地确保不需要的3/4字段在下一次循环迭代之前不会在内存中? 这是我目前的方法:
data = []
for source in SOURCES:
data_buff = read_source(source) # data_buff has 4 fields ('a','b','c','d')
data_buff = data_buff['a'] # only select required field
data.append(data_buff)
看起来您有一个结构化数组; 至少与您访问字段的方式一致。
在我当前的ipython会话中,我有一个结构化数组,其中包含3个字段和64个元素。
In [1383]: data1.shape
Out[1383]: (64,)
In [1384]: data1.dtype
Out[1384]: dtype([('f0', 'u1'), ('f1', 'u1'), ('f2', 'u1')])
In [1385]: data1.__array_interface__
Out[1385]:
{'data': (163303000, False),
'descr': [('f0', '|u1'), ('f1', '|u1'), ('f2', '|u1')],
'shape': (64,),
'strides': None,
'typestr': '|V3',
'version': 3}
如果我索引一个字段,则会得到一个view
-相同的data
缓冲区指针:
In [1386]: data1['f0'].__array_interface__
Out[1386]:
{'data': (163303000, False),
'descr': [('', '|u1')],
'shape': (64,),
'strides': (3,),
'typestr': '|u1',
'version': 3}
但是,如果我使用copy
,那么我将获得一个新的数据缓冲区。
In [1387]: data1['f0'].copy().__array_interface__
Out[1387]:
{'data': (166164152, False),
'descr': [('', '|u1')],
'shape': (64,),
'strides': None,
'typestr': '|u1',
'version': 3}
因此,如果我执行data1=data1['f0'].copy()
,并且原始data1
没有任何其他views
,则该数据缓冲区空间将被回收。
数组使用的大部分空间都在数据缓冲区中。 它是由numpy本身管理的,而不是Python GC。 显然,它们以一种或多种方式相互作用。 因此,我认为最好的办法是确保您收集副本,而不是视图。
我不太确定,但我想无法释放python中的内存,这意味着即使删除引用变量,某些数组或任何对象所占用的内存也无法以编程方式添加到可用内存池中。 时间到了,它将被GC
删除。例如尝试链接
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.