0

我正在使用深度学习进行 3D 图像分割。基本上,我需要 1/ 填充一个 numpy 数组,2/ 处理数组,3/ 取消填充数组。

dataArray = np.pad(dataArray, 25, mode='constant', constant_values=0) # pad
processedArray = my_process(dataArray) # process
processedArray = processedArray[25:-25, 25:-25, 25:-25, :] # unpad

问题是,processedArray 非常大(464,928,928,928,10),我在执行 unpadding 时内存不足。我想unpadding分配新内存?我对吗?我该如何继续,以便没有分配新的内存?换句话说,让索引指向未填充的元素,而不复制元素?

可能有帮助的信息:以上行在函数中执行,并返回处理数组

4

2 回答 2

0

也许你的内存用完了,因为一旦你用这个数组调用函数,就会在函数内部创建一个副本,这会使你的内存加倍。所以,只是不要创建额外的数组。

您可以保留数组的全局副本。只需在全局数组上应用这些操作,而无需创建额外的副本。

import gc

global processedArray # before all your assignment starts

在 my_process() 里面

def my_process():
   global processedArray
   # do all operations on processedArray
global processedArray
processedArray = np.pad(dataArray, 25, mode='constant', constant_values=0) # pad
my_process()

del dataArray() # delete not needed arrays to make more space
gc.collect()

global processedArray
processedArray = processedArray[25:-25, 25:-25, 25:-25, :] # unpad

但是,如果你的 my_process 调用更多的库函数来复制处理数组,你仍然会用完内存。尝试在全局数组上应用每个操作而不进行任何复制。

于 2020-04-03T16:52:43.920 回答
0

内存问题的一个可能解决方案是使用 short 而不是 float 作为 numpy 数据类型。你可以试试这个。

dataArray = np.pad(dataArray, 25, mode='constant', constant_values=0) # pad
processedArray = my_process(dataArray).astype(np.short) # process
processedArray = processedArray[25:-25, 25:-25, 25:-25, :] # unpad
processedArray = processedArray.astype(np.float32) #Converting to float type again

或者,您可以删除您dataArray的为processedArray.

dataArray = np.pad(dataArray, 25, mode='constant', constant_values=0) # pad
del dataArray #deleting dataArray to claim memory
processedArray = my_process(dataArray) # process
processedArray = processedArray[25:-25, 25:-25, 25:-25, :] # unpad
于 2020-04-03T17:02:28.367 回答