Я использую 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.
Я установил GDAL Core и плагины (dll's) с gisinternals.com, но почему-то я не думал устанавливать там также и Python Bindings. Привязки Python, которые я установил, были с другого сайта (на данный момент не могу вспомнить, какой именно).
Когда я переустановил GDAL и Python Bindings все с gisinternals.com, я смог успешно прочитать AsAsArray.
Спасибо всем, кто прокомментировал и ответил, и я прошу прощения за мое невежество.
источник
Возможно, это проблема с памятью. Когда вы используете ReadAsArray, он переносит данные в память, и хотя 800 Мбайт не массивны, они также не крошечные. Вы пробовали читать массив кусками?
Вы должны иметь возможность циклически проходить по массиву и обрабатывать его по частям, хотя в зависимости от обработки, которую вы выполняете, вам, вероятно, следует обратить внимание на чтение в областях с перекрытием, чтобы избежать краевых эффектов.
источник
data = b.ReadAsArray(0,0, 500, 500)
с тем же результатом.Извините, что опоздал на эту вечеринку, но ваша основная проблема в том, что 32-битный Python не может хранить очень большие растры в памяти. Вы можете считывать свой большой растр в память кусками размером в куски, но тогда вы довольно ограничены в том, что вы можете эффективно обрабатывать без крайне неэффективного / частого чтения / записи на диск.
Вместо этого я делаю (что жертвует некоторой эффективностью из-за чтения / записи на диск), чтобы вызвать ( через упаковку в EXE ) 64-битную версию gisinternals.com того метода, который вам нужен. Будьте осторожны с использованием модуля подпроцесса python в цикле (т.е. вы можете / должны вызывать подпроцесс последовательно ), так как вы можете непреднамеренно генерировать слишком много открытых потоков для вашего окна и получать зловещие системные предупреждения. С этим подходом gdal вы немного жертвуете чтением / записью на диск, но ваша эффективность обработки только падает (т. Е. По сравнению с быстрыми вычислениями в памяти , если ваша коробка / библиотека может их поддерживать) примерно в два раза или 10.
источник