Ниже я показал пример, воспроизводящий мою ситуацию. Мой массив составляет 14,5 ГБ, а маска составляет ~ 7 ГБ, но у меня для этого выделено 64 ГБ ОЗУ, поэтому я не понимаю, почему это не удается.
Код: Выделить всё
import numpy as np
arr = np.zeros((1, 71829, 101321), dtype='uint16')
arr.nbytes
#14555572218
mask = np.random.randint(2, size=(71829, 101321), dtype='bool')
mask.nbytes
#7277786109
nodata = 0
#this results in OOM error
arr[:, mask] = nodata
Код: Выделить всё
arr = np.zeros((71829, 101321), dtype='uint16')
arr.nbytes
#14555572218
mask = np.random.randint(2, size=(71829, 101321), dtype='bool')
mask.nbytes
#7277786109
nodata = 0
#this works
arr[mask] = nodata
Я предполагаю, что arr[mask] = nodata изменяет массив на месте, но arr[:, маска] = nodata создает новый массив, но я не знаю, почему это так. Даже если бы это было так, для этого все равно должно хватить места, поскольку общий размер arr и маски составит 22 ГБ, а у меня 64 ГБ ОЗУ.
Я пытался найти это, я нашел это, но я новичок в numpy и не понял объяснения более длинного ответа. Я попробовал подход np.where из другого ответа на этот вопрос, но все равно получаю ошибку OOM.
Любой вклад будет оценен.
Подробнее здесь: https://stackoverflow.com/questions/787 ... g-sufficie