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.