2016-07-12 66 views
0

我有一个包含几个大的列表numpy arrays如何保留一个numpy数组的片并从内存中清除其余部分?

我想只保留这些数组中的每一个片,并清除我的系统内存。我曾尝试使用关键字delNone,但这些似乎没有任何效果(我使用Fedora系统监视器来监视RAM使用情况)。

问题是我想使用numpy.save()保存我的切片,但内存不足,因此我的问题。

比如我有:

my_list = [arr0, arr1, arr2] 

而且我想直到结束:

my_list = [arr0[10:100], arr1[10:100], arr2[10:100]] 

所以我试图做

arr_tmp = np.copy(arr0[10:100]) 
my_list[0] = arr_tmp 
arr0 = None 

arr_tmp = np.copy(arr0[10:100]) 
my_list[0] = arr_tmp 
del arr0 

但这些似乎没有工作。

编辑:当我使用numpy.save()函数时,内存不足,而不是在切片我的数组时。我想在拨打numpy.save()之前释放一些内存,这样它不会被系统杀死。

+0

形状相同的那些阵列? – Divakar

+0

是的,它们具有相同的形状 – jmatthieu

+0

你能初始化一个形状为“(N_arrs,91)”的输出数组吗?并且从arr0,arr1等迭代地填充它。我假设你正在耗尽内存来创建'my_list':'my_list = [arr0 [10:100],arr1 [10:100],arr2 [10:100]]''。 – Divakar

回答

0

您可以通过转列表两次做到这一点:my_list.transpose()[10:100].transpose()

arr1=[0,1,2,3,4] 
arr2=[0,1,2,3,4] 
arr3=[0,1,2,3,4] 
my_list=np.array([arr1,arr2,arr3]) 
my_list.transpose()[1:4].transpose() 

回报:

array([[1, 2, 3], 
     [1, 2, 3], 
     [1, 2, 3]]) 

如果你把它保存在一个新的价值,你应该能够只是删除旧的阵列。

然后,您可以触发垃圾收集与gc包中取出unreference值(见documentation):

import gc 
gc.collect() 
+0

如何删除旧数组?将它分配给'None'或使用'del'似乎不起作用 – jmatthieu

+0

@jmatthieu我已经更新了我的答案,以包含'gc.collect()'的垃圾回收。 – Swier

相关问题