Как распределить операции по спискам очень больших массивов и освободить память - PullRequest
0 голосов
/ 10 апреля 2019

Я хочу выполнять операции (сложение, умножение, деление) для очень больших числовых массивов, включенных в список, как показано в части I кода. list_arrays - это список длиной 24, каждый элемент имеет 4D массив формы [360, 10, 241, 480], но я получаю ошибку памяти, когда запускаю код.

Я попытался разделить список на более мелкие списки (часть II кода прилагается), выполнить необходимые операции над фрагментом и сохранить его в файле npy, затем сделать то же самое со следующим фрагментом, пока я не закончу со всеми из них ( Часть III).

Но после зацикливания фрагмента память все еще занята. Как освободить память после зацикливания на чанке, чтобы освободить место для следующего чанка.

##### 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 каждый файл содержит массив того же размера, но с новыми значениями

...