如何对非常大的numpy数组列表进行分块操作并释放内存

时间:2019-04-10 16:37:52

标签: python-3.x numpy bigdata chunking

我想对包含在列表中的非常大的numpy数组进行操作(加,乘,除),如代码的第一部分所示。 list_arrays是一个长度为24的列表,每个元素都是形状为[360、10、241、480]的4D数组,但是运行代码时出现内存错误。

我试图将列表分块为更小的列表(附加了代码的第二部分),并对一个分块进行所需的操作,并将其保存到npy文件,然后对下一个分块进行相同的操作,直到完成所有操作为止(第三部分)。

但是在遍历一个块之后,内存仍然很忙。在遍历一个块以获取下一个块的空间后如何释放内存。

##### Part I ######
n_l = []
for i in range(len(list_arrays)):
    if i ==0:
        m = list_arrays[i]/2 * 8
    else:
        m = ((list_arrays[i]+list_arrays[i-1])/2) * 8
    n_l.append(m)
#n_l is a new list of same length as list_arrays but includes arrays with new values
##########################################

##### Part II ######
def chunking(l, n): ##Chunking function
    for i in range(0, len(l), n):
        yield l[i:i+n]
chunks = list(chunking(list_arrays, 5)) 
# chunks is a list of 5 lists each list includes five 4D arrays
##########################################

##### Part III ######
for i in range(len(chunks)):
    if i == 0:
        for ii in range(len(chunks[i])):
            if ii == 0:
                m = (chunks[i][ii] /2) * 8
            else:
                m = ((chunks[i][ii] + chunks[i][ii -1]) /2) * 8
        np.save('./chunk_%d/%d.npy'%i, m)
    if i != 0:
        for ii in range(len(chunks[i])):
            if ii == 0:
                m = ((chunks[i][ii]+ chunks[i-1][-1]) /2) * 8
            else:
                m = ((chunks[i][ii] + chunks[i][ii -1]) /2) * 8
        np.save('./chunk_%d/%d.npy' %i, m)
#########################################

我希望每个文件包含25个npy文件,这些文件包含一个大小相同但具有新值的数组

0 个答案:

没有答案