Gdal Dataset.ReadAsArray ()가 Python과 충돌합니다


12

Windows 7 64bit에 Numpy 1.3 및 Gdal 1.9.1이 설치된 Python 2.6.5 (32bit)를 사용하고 있습니다. 래스터 대수를 수행하기 위해 800MB Imagine (.img) 래스터 데이터 세트를 Numpy 배열로 읽으려고하는데 다음 코드를 실행하자마자 Python.exe가 충돌합니다.

from osgeo import gdal

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

b.ReadAsArray()호출시 Python.exe가 충돌합니다 . 나는 구글 검색을하고 Gdal 1.6에서 Windows 7 64 비트와 함께이 문제를 언급 한 기사를 찾았지만 당시 최신 개발 버전에서 수정되었다고 언급했습니다.

다른 사람 이이 문제를 겪었습니까? 해결 방법이 있습니까?

최신 정보:

PyDev에서 코드를 디버깅하여 오류가 발생한 위치를 확인하기로 결정했습니다. 내가 말할 수있는 것 (여전히 오류 메시지가 표시되지 않음)은 gdal_array.py의 22 번째 줄에서 실패합니다.

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

위의 코드 줄에 들어가면 numpy 의 init .py 모듈로 이동합니다. 내가 numpy의 끝에 도달했을 때. __ init __ .py 모듈은 위의 코드 줄로 돌아갑니다. 그런 다음 step into 버튼을 누르면 gdal_array.py 내의 다음 줄로 이동해야합니다. 스크립트는 오류 메시지 또는 아무것도없이 종료됩니다.

업데이트 # 2 :

GDAL 1.9.1을 제거하고 Python Cheeseshop 및 OSGeo의 Windows 바이너리에서 GDAL 1.6.1을 설치했습니다. 여전히 같은 문제가있었습니다.


이 문제가 발생했습니다. gis.internals에서 Tamas의 gdal python 바인딩을 사용하고 있습니까? 그렇다면 추가 항목을 PATH에 추가하십시오. 다른 도서관에서 문제가 발생했습니다.
Jay Laura

나는 그의 내부에서 다운로드했다고 생각합니다. 내일 사무실에 도착하면 길을 조정하려고합니다. 조언 해주셔서 감사합니다.
Brian

1
그래도 문제가 해결되지 않으면 최근이 패키지 ( lfd.uci.edu/~gohlke/pythonlibs)
Jay Laura

운없이 시스템 경로 (Windows의 PATH 환경 변수)에서 물건을 옮기려고했습니다. 또한 GDAL 버전을 제거하고 제공 한 링크에 GDAL 버전을 설치했지만 여전히 동일한 문제가있었습니다.
Brian

흠 .... 연결 된 버전은 바인딩 일뿐이므로 Tamas의 GDAL 코어가 여전히 필요합니다. 그래도 다른 전화가 작동하면 정상적으로 작동합니다. 시도해야 할 세 가지 방법은 긴 샷입니다 ( '길이'순서). 1) Numpy 버전을 업데이트하십시오. 2) gdal_을 gtiff로 변환하고 해당 이미지에서 코드를 시도하십시오. 3) ReadAsArray ()를 .astype (numpy.float32)로 추가하십시오. 이미지가 공개됩니까? 내 컴퓨터에서 테스트 할 수 있습니다. 해당 작업이 없으면 스택 추적을 게시 할 수 있습니까?
Jay Laura

답변:


5

많은 주석가들에 의해 의심되는 것처럼 이것은 설치에 문제가되었습니다. 분명히, 나는 GDAL과 Python Bindings를 설치할 때 충분히주의를 기울이지 않았다.

gisinternals.com에서 GDAL Core 및 플러그인 (dll)을 설치했지만 어떻게 든 거기에서 Python Bindings를 설치하지 않았다. 내가 설치 한 파이썬 바인딩은 다른 사이트에서 온 것입니다 (이 시점에서 어느 것을 기억할 수는 없습니다).

gisinternals.com에서 GDAL 및 Python 바인딩을 모두 다시 설치하면 ReadAsArray를 성공적으로 완료 할 수있었습니다.

의견을 말하고 답변 해 주신 모든 분들께 감사 드리며 무지에 대해 사과드립니다.


3

메모리 문제 일 수 있습니다. ReadAsArray를 사용하면 데이터가 메모리에 들어가고 800mb는 크지 않지만 작지도 않습니다. 배열을 청크로 읽었습니까?

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

배열을 반복하고 한 번에 청크를 처리 할 수 ​​있어야하지만 처리중인 처리에 따라 엣지 효과를 피하기 위해 겹치는 영역을 읽는 것이 좋습니다.


청크를 사용해 보았습니다. 나는 data = b.ReadAsArray(0,0, 500, 500)같은 결과로 시도했다 .
Brian

흠. 다른 이미지 형식을 시도했다고 가정합니까? 또한 특정 오류 메시지가 있습니까?
om_henners

아직 다른 형식을 시도하지 않았습니다. 오류 메시지가 없었으며 "python.exe가 작동을 멈췄습니다"라는 팝업 만 표시되었습니다.
Brian

오늘 아침에 .img 파일을 GeoTIFF로 변환하고 다시 시도했습니다. 불운.
Brian

gdal에서 파일을 메모리에 매핑하는 방법이 있습니까?
CMCDragonkai

1

죄송합니다.이 파티에 늦었지만 기본 문제는 32 비트 파이썬이 메모리에 매우 큰 래스터를 저장할 수 없다는 것입니다. 바이트 단위로 큰 래스터를 메모리로 읽을 수 있지만 디스크에 대한 비효율적이거나 빈번한 읽기 / 쓰기없이 효율적으로 처리 할 수있는 대상이 상당히 제한적입니다.

대신 디스크 읽기 / 쓰기로 인해 효율성이 저하되는 작업 은 필요한 gdal 방법에 대한 64 비트 gisinternals.com 버전 을 호출 ( EXE-wrapping을 통해 )하는 것입니다. 실수로 창 상자에 대해 너무 많은 열린 스레드를 생성하고 불길한 시스템 경고 가 발생할 수 있으므로 루프에서 파이썬의 하위 프로세스 모듈을 사용하는 데주의하십시오 (즉, 하위 프로세스를 순차적으로 호출 해야 할 수도 있습니다). (예를 기준으로 당신은 디스크로가는 길에 조금이 GDAL 접근 / 쓰기 읽기 희생, 그러나 당신의 처리 효율은 떨어 번개 빠른 메모리 계산 요소에 대해에 의해, 경우 상자 / 라이브러리를 지원할 수) 또는 10.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.