2015-05-25 5 views
0

У меня есть проблема с преобразованием некоторого количества (в данном случае 153) 2D-массивов Numpy в 3D-массив (эти 2D-массивы представляют собой серые изображения - то есть 2048x2048x1 - для того, чтобы обрабатывать последовательность изображений вместо набора 2D-изображений). Мне нужно это, чтобы получить сигнал, сформированный с каждым значением пикселя со временем (что должно быть удобно с помощью Numpy, как только эта проблема будет решена).MemoryError пытается преобразовать 2D-массивы Numpy в 3D-массив

Мой код (довольно много) следующее:

zdim = len(imglist) # 'imglist' a Python list of the path for each image I need to process 
windowspan = 512 
xmin = ymin = 2 
xmax = ymax = xmin + windowspan 

sequence = [] 
for i in range(zdim): 
    hdulist = fits.open(imglist[i],'readonly') # allow to open FITS image files 
    hdr = hdulist[0].header['DATE-OBS'] # fetch the image date/time 
    img = fc.readfitsimg(imglist[i]) # return a np ndarray (2D) 
    patch = img[ymin:ymax, xmin:xmax] # take a small of the original image 
    print("patchSize : " + str(patch.size*4)) 
    sequence.append(patch) # adding to the list 
    print("it : " + str(i)) 
sequence = np.array(sequence) # transform to numpy array 

интерпретатор возвращает MemoryError примерно через 85 итераций ...

Любой бы есть какие-либо намеки на то, что происходит? (См. Некоторые подробности ниже)

Другие детали: - Я использую WinPython 32 бита (переносимый), потому что я не могу установить «правильный» дистрибутив Python (я переключался между Python 2.7.9.4 и 3.4.3.3 для цель тестирования) - Я вынужден использовать 32-битную Windows 7 на ПК с 4 ГБ, поэтому 3.5 ГБ для использования/Я попытался выполнить мой сценарий на другом компьютере (Win7 64 бит, 16 ГБ ОЗУ)

Спасибо за любую помощь, которую вы могли бы мне предоставить.

+0

Вы должны дать всю обратную линию памяти MemoryError, в частности, на какой строке это произойдет. – cfh

ответ

2

MemoryError происходит, когда на вашем компьютере заканчивается память RAM. В этом случае вы, кажется, закончите, добавив все изображения в куб, когда достигли предела 85x512x512. Если это была единственная проблема с кодом, я бы посоветовал использовать memmap для сохранения результатов непосредственно на жесткий диск, а не в ОЗУ. Опция memmap также доступна, когда вы открываете файл fits fits.open(..., memmap=True). В этом случае вы открываете только изображение на диске и читаете нужные вам детали, вместо того, чтобы загружать все изображение в ОЗУ.

Но реальная проблема здесь, я подозреваю, заключается в том, что вы открываете файлы с файлами без закрытия в конце цикла (hdu.close() в вашем случае).

+0

привет, маленький вопрос: будет ли пакет «bcolz» решением для этого? – stonebig

+0

Просто чтобы вы знали, что техника «memmap» не работает из-за типа данных («ValueError: невозможно загрузить изображение с отображением в память: присутствуют ключевые слова заголовка BZERO/BSCALE/BLANK. Установите memmap = False. ') – Paradox

+0

проблема в моем случае, если я хочу иметь вектор значений оттенков серого для каждого пикселя с течением времени и использовать в то же время структуры данных Numpy, мне нужно будет загружать все в ОЗУ (вот почему я использовал патч намного меньше чем исходное изображение). Я забыл упомянуть, что «пригонки» - это псевдоним для модуля «Pyfits», где нет метода «close» ... \t Если MemoryError появляется, выделенное ОЗУ должно быть заполнено. Как бы вы объяснили, что распределенная ОЗУ будет одинаковой между двумя различными операционными системами (32 против 64 бит и, соответственно, 3,5 против 16 ГБ ОЗУ)? – Paradox

Смежные вопросы