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.
źródło
Odpowiedzi:
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ę.
źródło
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?
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.
źródło
data = b.ReadAsArray(0,0, 500, 500)
z tym samym rezultatem.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
źródło