Gdal Dataset.ReadAsArray () вибиває Python


12

Я використовую Python 2.6.5 (32-бітний) з Numpy 1.3 та Gdal 1.9.1, встановленими на Windows 7 64bit. Я намагаюсь прочитати растровий набір зображень (.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. Коли я доходжу до кінця нумеру. __ init __ .py модуль, він повертається до вищевказаного рядка коду. Потім, коли я натискаю на крок до кнопки, яка повинна привести мене до наступного рядка в gdal_array.py, сценарій просто закінчується без повідомлень про помилки чи нічого.

ОНОВЛЕННЯ №2:

Я видалив GDAL 1.9.1 та встановив GDAL 1.6.1 з Python Cheeseshop та Windows Binaries OSGeo. Ще було те саме питання.


У мене було це питання. Чи використовуєте ви прив'язки gdal python від тамас у gis.internals? Якщо так, перенесіть ваші доповнення в ПАТУ на передню частину. Якась інша бібліотека викликала певну проблему для мене.
Джей Лора

Я вважаю, що я його скачав із внутрішніх справ. Я спробую скорегувати свій шлях, коли завтра прийду в офіс. Дякую за пораду.
Брайан

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 Bindings.

Я встановив GDAL Core і плагіни (dll's) з gisinternals.com, але я якось не думав також встановлювати зв'язки Python. Прив’язки Python, які я встановив, були з іншого сайту (не можу пригадати, який з них у цей момент).

Коли я перевстановив GDAL і Python Bindings, всі з gisinternals.com, мені вдалося успішно ReadAsArray.

Дякую всім, хто коментував і відповідав, і вибачаюся за своє незнання.


3

Можливо, це питання пам’яті. Коли ви використовуєте ReadAsArray, він приносить дані в пам'ять, і хоча 800mb не є масовим, він також не крихітний. Ви спробували прочитати масив шматками?

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

Ви повинні мати можливість перебирати масив та обробляти його фрагменти за один раз, хоча залежно від обробки, яку ви виконуєте, вам, мабуть, слід поглянути на читання в областях із перекриттям, щоб уникнути крайових ефектів.


Я намагався використовувати шматки. Я намагався data = b.ReadAsArray(0,0, 500, 500)з тим же результатом.
Брайан

Хм. Я припускаю, що ви спробували інші формати зображень? Також, було якесь повідомлення про помилку?
om_henners

Я ще не пробував інших форматів. не було повідомлення про помилку, просто спливаюче вікно, яке сказало, що "python.exe перестав працювати".
Брайан

Я перетворив .img-файл в GeoTIFF сьогодні вранці і спробував ще раз. Не вдалося.
Брайан

Чи є спосіб пам'ятати файл пам'яті з файлу gdal?
CMCDragonkai

1

Вибачте, що я запізнився на цю вечірку, але ваша основна проблема полягає в тому, що 32-розрядний Python не може зберігати в пам'яті дуже великі растри. Ви можете читати великі растрові пам’яті в шматки розміру, але ви досить обмежені з точки зору того, що можете ефективно обробляти без надзвичайно неефективного / частого читання / запису на диск.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.