2012-05-14 7 views
2

Im пытается запустить Mort Canty's http://mcanty.homepage.t-online.de/ Реализация iMAD на Python на bitemporal RapidEye Мультиспектральные изображения. Что в основном вычисляет каноническую корреляцию для двух изображений, а затем вычитает их. Проблема, с которой я сталкиваюсь, - это , что изображения имеют размер 5000 х 5000 х 5 (диапазонов) пикселей. Если я попытаюсь запустить это на , все изображение получит ошибку памяти.Обработка большого спутникового изображения

Будет ли использование чего-то типа pyTables помочь мне в этом?

Какой код Морта Кэнти пытается сделать, так это то, что он загружает изображения с помощью gdal, а затем сохраняет их в массиве размером 10 х 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 вызывает ошибку памяти. У кого-нибудь есть хорошая идея, как обойти это? Это мой первый пост, поэтому любые советы о том, как публиковать сообщения, также приветствуются.

Приветствия

ответ

0

numpy использует float64 по умолчанию, так что ваш dm -array занимает 2 Гб оперативной памяти (8 * 10 * 25000000), другие массивы, вероятно, около 200Мб (~ 8 * 5000 * 5000) каждый.

astype(float) возвращает новый массив, поэтому вам также нужна память, и, вероятно, это даже не требуется, поскольку тип неявно преобразуется при копировании данных в массив результатов.

Когда память, используемая для цикла, освобождается, зависит от сбора мусора. и это не учитывает накладные расходы памяти GetRasterBand, ReadAsArray.

уверены, что ваши входные данные используют 64-битные поплавки? если он использует 32-битные поплавки, вы могли бы уменьшить половину использования памяти, указав dtype='f' на свои массивы.

+0

я все еще получаю ошибку памяти, если я указать DTYPE к 'е': TraceBack (самый последний вызов последнего): Файл "C: \ PythonXY \ iMad.py", строка 172, в основной() File «C: \ pythonxy \ iMad.py», строка 79, в основном dm = zeros ((2 * полосы, cols * rows), dtype = 'f') MemoryError Кстати, у меня есть 8 гб баранов. Есть ли простой способ, например, записать эти большие массивы в файл hdf5 с помощью pytables и работать с ними, как обычные массивы numpy? – JEquihua