Большая спутниковая обработка изображений

Я пытаюсь запустить 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' на ваших массивах.

Другие вопросы по тегам