Большая спутниковая обработка изображений
Я пытаюсь запустить Mort Canty's http://mcanty.homepage.t-online.de/ Python iMAD на битемпоральных изображениях RapidEye Multispectral. Который в основном вычисляет каноническую корреляцию для двух изображений и затем вычитает их. У меня проблема в том, что изображения имеют 5000 х 5000 х 5 (полос) пикселей. Если я пытаюсь запустить это на всем изображении, я получаю ошибку памяти.
Поможет ли мне в этом использование чего-то вроде pyTables?
Код Mort Canty пытается сделать то, что он загружает изображения с использованием gdal, а затем сохраняет их в массиве 10 x 25 000 000.
# initial weights
wt = ones(cols*rows)
# data array (transposed so observations are columns)
dm = zeros((2*bands,cols*rows))
k = 0
for b in pos:
band1 = inDataset1.GetRasterBand(b+1)
band1 = band1.ReadAsArray(x0,y0,cols,rows).astype(float)
dm[k,:] = ravel(band1)
band2 = inDataset2.GetRasterBand(b+1)
band2 = band2.ReadAsArray(x0,y0,cols,rows).astype(float)
dm[bands+k,:] = ravel(band2)
k += 1
Даже простое создание массива чисел с плавающей запятой 10 x 25 000 000 приводит к ошибке памяти. У кого-нибудь есть хорошая идея, как обойти это? Это мой первый пост, так что любые советы о том, как разместить пост, также будут приветствоваться.
Привет
1 ответ
numpy
использования float64
по умолчанию, так что ваш dm
- массив занимает 2 ГБ памяти (8*10*25000000), остальные массивы, вероятно, около 200 МБ (~8*5000*5000) каждый.
astype(float)
возвращает новый массив, поэтому вам также потребуется память - и, вероятно, даже не нужна, так как тип неявно преобразуется при копировании данных в результирующий массив.
освобождение памяти, используемой в цикле for, зависит от сборки мусора. и это не учитывает накладные расходы памяти GetRasterBand
, ReadAsArray
,
Вы уверены, что ваши входные данные используют 64-битные числа? если он использует 32-разрядные числа с плавающей запятой, вы можете легко уменьшить половину использования памяти, указав dtype='f'
на ваших массивах.