Gdal Dataset.ReadAsArray () аварийно завершает работу Python

12

Я использую Python 2.6.5 (32bit) с Numpy 1.3 и Gdal 1.9.1, установленными в Windows 7 64bit. Я пытаюсь прочитать набор растровых данных Imagine (.img) объемом 800 МБ в массив Numpy, чтобы выполнить некоторую растровую алгебру, но как только я запускаю следующий код, происходит сбой Python.exe.

from osgeo import gdal

g = gdal.Open(r'path\to\dataset', gdal.GA_Readonly)
b = g.GetRasterBand(1)
data = b.ReadAsArray()

Python.exe вылетает при b.ReadAsArray()вызове. Я провел поиск в Google и нашел статьи от Gdal 1.6, в которых упоминалась эта проблема с Windows 7 64bit, но они также отметили, что она была исправлена ​​в последних версиях для разработчиков на тот момент.

У кого-нибудь еще была эта проблема? Есть обходные пути?

ОБНОВИТЬ:

Я решил отладить код в PyDev, чтобы попытаться определить, где он выходит из строя. Из того, что я могу сказать (все еще не получая никаких сообщений об ошибках), это терпит неудачу на строке 22 gdal_array.py.

_mod = imp.load_module('_gdal_array', fp, pathname, description)

Когда я перехожу к строке кода выше, это приводит меня в модуль init .py numpy. Когда я достигну конца NumPy. __ init __ .py модуль, он возвращается к приведенной выше строке кода. Затем, когда я нажимаю кнопку перехода на шаг, который должен привести меня к следующей строке в gdal_array.py, сценарий просто завершается без сообщений об ошибках или чего-либо еще.

ОБНОВЛЕНИЕ № 2:

Я удалил GDAL 1.9.1 и установил GDAL 1.6.1 из Python Cheeseshop и бинарников Windows OSGeo. Все еще была та же проблема.

Брайан
источник
У меня была эта проблема. Используете ли вы gdal python-привязки от Tamas на gis.internals? Если это так, перенесите свои дополнения в PATH на передний план. Другая библиотека вызывала у меня проблемы.
Джей Лора
Я думаю, что я загрузил из его внутренних органов. Я постараюсь скорректировать свой путь, когда завтра приеду в офис. Спасибо за совет.
Брайан
1
Если это не работает, я недавно переключился на использование этих пакетов - lfd.uci.edu/~gohlke/pythonlibs
Jay Laura
Я безуспешно пытался перемещать вещи в моем системном пути (переменная среды PATH в Windows). Я также удалил свою версию GDAL и установил версию GDAL по предоставленной вами ссылке, но у меня все еще была та же проблема.
Брайан
Хм ... версия, на которую я ссылался, была только привязкой, так что вам все еще нужно иметь ядро ​​GDAL от Tamas. Если другие вызовы работали, это работает нормально. Три вещи, которые можно попробовать, это длинные выстрелы (в порядке «длинности». 1) Обновите свою версию Numpy. 2) gdal_translate для gtiff и попробуйте код на этом изображении. 3) добавьте ReadAsArray () с помощью .astype (numpy.float32). Является ли изображение публичным? Я могу проверить это на моей машине. Можете ли вы опубликовать трассировку стека, если ничего из этого не работает?
Джей Лора

Ответы:

5

Как и подозревали многие комментаторы, это была проблема с моей установкой. По-видимому, я не уделял достаточно пристального внимания при установке GDAL и привязок Python.

Я установил GDAL Core и плагины (dll's) с gisinternals.com, но почему-то я не думал устанавливать там также и Python Bindings. Привязки Python, которые я установил, были с другого сайта (на данный момент не могу вспомнить, какой именно).

Когда я переустановил GDAL и Python Bindings все с gisinternals.com, я смог успешно прочитать AsAsArray.

Спасибо всем, кто прокомментировал и ответил, и я прошу прощения за мое невежество.

Брайан
источник
3

Возможно, это проблема с памятью. Когда вы используете ReadAsArray, он переносит данные в память, и хотя 800 Мбайт не массивны, они также не крошечные. Вы пробовали читать массив кусками?

data = b.ReadAsArray(x_offset, y_offset, x_size, y_size)

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

om_henners
источник
Я попробовал использовать куски. Я пытался data = b.ReadAsArray(0,0, 500, 500)с тем же результатом.
Брайан
Хм. Я предполагаю, что вы пробовали другие форматы изображений? Кроме того, было ли конкретное сообщение об ошибке?
om_henners
Я еще не пробовал другие форматы. не было никакого сообщения об ошибке, только всплывающее окно с надписью "python.exe перестал работать".
Брайан
Сегодня утром я преобразовал файл .img в GeoTIFF и попытался снова. Неудачно.
Брайан
Есть ли способ на карте памяти файл из gdal?
CMCDragonkai
1

Извините, что опоздал на эту вечеринку, но ваша основная проблема в том, что 32-битный Python не может хранить очень большие растры в памяти. Вы можете считывать свой большой растр в память кусками размером в куски, но тогда вы довольно ограничены в том, что вы можете эффективно обрабатывать без крайне неэффективного / частого чтения / записи на диск.

Вместо этого я делаю (что жертвует некоторой эффективностью из-за чтения / записи на диск), чтобы вызвать ( через упаковку в EXE ) 64-битную версию gisinternals.com того метода, который вам нужен. Будьте осторожны с использованием модуля подпроцесса python в цикле (т.е. вы можете / должны вызывать подпроцесс последовательно ), так как вы можете непреднамеренно генерировать слишком много открытых потоков для вашего окна и получать зловещие системные предупреждения. С этим подходом gdal вы немного жертвуете чтением / записью на диск, но ваша эффективность обработки только падает (т. Е. По сравнению с быстрыми вычислениями в памяти , если ваша коробка / библиотека может их поддерживать) примерно в два раза или 10.

ksed
источник