Gdal Dataset.ReadAsArray () powoduje awarię Pythona

13

Używam Pythona 2.6.5 (32-bitowego) z Numpy 1.3 i Gdal 1.9.1 zainstalowanym na Windows 7 64-bitowym. Próbuję odczytać zestaw danych rastrowych Imagine (.img) o pojemności 800 MB do tablicy Numpy, aby wykonać algebrę rastrową, ale gdy tylko uruchomię następujący kod, Python.exe ulega awarii.

from osgeo import gdal

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

Python.exe ulega awarii podczas b.ReadAsArray()połączenia. Przeszukałem Google i znalazłem artykuły datowane na Gdal 1.6, które wspominały o tym problemie z Windows 7 64bit, ale wspomniały również, że zostało to naprawione w najnowszych wersjach programistycznych w tym czasie.

Czy ktoś jeszcze miał ten problem? Jakieś obejścia?

AKTUALIZACJA:

Postanowiłem debugować kod w PyDev, aby spróbować ustalić, gdzie się nie udaje. Z tego, co mogę powiedzieć (wciąż nie otrzymuję żadnych komunikatów o błędach), to nie działa w linii 22 pliku gdal_array.py.

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

Kiedy wchodzę w powyższy wiersz kodu, przenosi mnie do modułu init .py numpy. Kiedy dotrę do końca numpy. Moduł __ init __ .py, wychodzi z powrotem do powyższej linii kodu. Następnie, kiedy nacisnąłem przycisk „krok do”, co powinno doprowadzić mnie do następnego wiersza w gdal_array.py, skrypt kończy się bez żadnych komunikatów o błędach ani niczego.

AKTUALIZACJA # 2:

Odinstalowałem GDAL 1.9.1 i zainstalowałem GDAL 1.6.1 z Python Cheeseshop i binariów Windows OSGeo. Nadal miałem ten sam problem.

Brian
źródło
Miałem ten problem. Czy używasz powiązań gdal python od Tamas na gis.internals? Jeśli tak, przenieś swoje dodatki do ŚCIEŻKI na przód. Jakaś inna biblioteka powodowała dla mnie problem.
Jay Laura,
Wydaje mi się, że pobrałem go z jego wewnętrznych części. Postaram się dostosować swoją ścieżkę, kiedy jutro będę w biurze. Dzięki za radę.
Brian
1
Jeśli to nie zadziała, niedawno przełączyłem się na używanie tych pakietów - lfd.uci.edu/~gohlke/pythonlibs
Jay Laura
Próbowałem przenosić rzeczy na ścieżce systemowej (zmienna środowiskowa PATH w systemie Windows) bez powodzenia. Odinstalowałem również moją wersję GDAL i zainstalowałem wersję GDAL na podanym linku i nadal miałem ten sam problem.
Brian
Hmmm .... wersja, z którą się połączyłem, była tylko wiązaniami, więc nadal musisz mieć rdzeń GDAL od Tamas. Jeśli inne połączenia działały, to działa dobrze. Trzy rzeczy do wypróbowania to długie ujęcia (w kolejności „długości”. 1) Zaktualizuj swoją wersję Numpy. 2) gdal_translate to gtiff i wypróbuj kod z tego obrazu. 3) dołącz ReadAsArray () z .astype (numpy.float32). Czy obraz jest publiczny? Mogę to przetestować na moim komputerze. Czy możesz opublikować ślad stosu, jeśli żaden z nich nie działa?
Jay Laura,

Odpowiedzi:

5

Jak podejrzewało wielu komentujących, był to problem z moją instalacją. Najwyraźniej nie zwracałem wystarczającej uwagi podczas instalowania GDAL i powiązań Pythona.

Zainstalowałem GDAL Core i wtyczki (dll's) z gisinternals.com, ale jakoś nie pomyślałem o zainstalowaniu tam również Python Bindings. Wiązania Python, które zainstalowałem, pochodziły z innej witryny (nie pamiętam, która z nich w tym momencie).

Kiedy ponownie zainstalowałem GDAL i Python Bindings wszystkie z gisinternals.com, udało mi się pomyślnie ReadAsArray.

Dziękuję wszystkim, którzy skomentowali i odpowiedzieli, i przepraszam za moją ignorancję.

Brian
źródło
3

Możliwe, że to problem z pamięcią. Kiedy używasz ReadAsArray, przenosi dane do pamięci, a chociaż 800 MB nie jest ogromne, nie jest też małe. Czy próbowałeś czytać tablicę we fragmentach?

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

Powinieneś być w stanie zapętlać tablicę i przetwarzać ją jednocześnie, ale w zależności od wykonywanego przetwarzania prawdopodobnie powinieneś spróbować czytać w obszarach z nakładaniem się, aby uniknąć efektów krawędzi.

om_henners
źródło
Próbowałem używać kawałków. Próbowałem data = b.ReadAsArray(0,0, 500, 500)z tym samym rezultatem.
Brian
Hmm Zakładam, że wypróbowałeś inne formaty obrazów? Czy pojawił się także konkretny komunikat o błędzie?
om_henners
Nie próbowałem jeszcze żadnych innych formatów. nie było komunikatu o błędzie, tylko wyskakujące okienko z informacją, że „python.exe przestał działać”.
Brian
Dziś rano przekonwertowałem plik .img na GeoTIFF i spróbowałem ponownie. Brak szczęścia.
Brian
Czy istnieje sposób na mapowanie pamięci pliku od gdal?
CMCDragonkai
1

Przepraszam za spóźnienie na tę imprezę, ale twoim podstawowym problemem jest to, że 32-bitowy Python nie może przechowywać w pamięci bardzo dużych rastrów. Możesz wczytać swój duży raster do pamięci w kawałkach wielkości kęsa, ale wtedy jesteś dość ograniczony pod względem tego, co możesz wydajnie przetwarzać bez wyjątkowo nieefektywnego / częstego odczytu / zapisu na dysk.

Zamiast tego (co poświęca trochę wydajności z powodu odczytu / zapisu dysku) jest wywołanie ( za pomocą owijania EXE ) 64-bitowej wersji gisinternals.com dowolnej metody gdal, której potrzebujesz. Ostrożnie korzystaj z modułu podprocesu Pythona w pętli (tzn. Możesz chcieć / trzeba wywoływać podproces sekwencyjnie ), ponieważ możesz przypadkowo wygenerować zbyt wiele otwartych wątków dla twojego okna i uzyskać złowieszcze ostrzeżenia systemowe. Poświęcasz trochę na drodze do odczytu / zapisu na dysku dzięki temu podejściu gdal, ale twoja wydajność przetwarzania spada tylko (tj. W stosunku do błyskawicznego obliczenia w pamięci , jeśli twoja skrzynka / biblioteka może to obsługiwać) o czynnik lub 10

ksed
źródło