Saya menggunakan Python 2.6.5 (32bit) dengan Numpy 1.3 dan Gdal 1.9.1 diinstal pada Windows 7 64bit. Saya mencoba membaca dataset raster 800 MB Imagine (.img) menjadi array Numpy untuk melakukan beberapa aljabar raster, tetapi segera setelah saya menjalankan kode berikut, Python.exe lumpuh.
from osgeo import gdal
g = gdal.Open(r'path\to\dataset', gdal.GA_Readonly)
b = g.GetRasterBand(1)
data = b.ReadAsArray()
Python.exe lumpuh saat b.ReadAsArray()
dipanggil. Saya melakukan beberapa pencarian Google dan menemukan artikel bertanggal dari Gdal 1.6 yang menyebutkan masalah ini dengan Windows 7 64bit, tetapi mereka juga menyebutkan bahwa itu telah diperbaiki dalam versi pengembangan terbaru pada waktu itu.
Adakah orang lain yang mengalami masalah ini? Ada solusi?
MEMPERBARUI:
Saya memutuskan untuk men-debug kode di PyDev untuk mencoba menentukan di mana ia gagal. Dari apa yang saya tahu (masih belum mendapatkan pesan kesalahan) gagal pada baris 22 dari gdal_array.py.
_mod = imp.load_module('_gdal_array', fp, pathname, description)
Ketika saya melangkah ke baris kode di atas, ia membawa saya ke modul init .py dari numpy. Saat aku mencapai ujung numpy. __ init __ .py module, ia melangkah mundur ke baris kode di atas. Kemudian, ketika saya menekan tombol step to, yang seharusnya membawa saya ke baris berikutnya dalam gdal_array.py, skrip berakhir dengan tidak ada pesan kesalahan atau apa pun.
PEMBARUAN # 2:
Saya menghapus GDAL 1.9.1 dan menginstal GDAL 1.6.1 dari Python Cheeseshop dan OSGeo's Windows Binaries. Masih memiliki masalah yang sama.
sumber
Jawaban:
Seperti yang diduga oleh banyak komentator, ini adalah masalah dengan instalasi saya. Rupanya, saya tidak cukup memperhatikan ketika menginstal GDAL dan Python Bindings.
Saya menginstal GDAL Core dan plugin (dll) dari gisinternals.com, tetapi entah bagaimana saya tidak berpikir untuk menginstal Python Bindings dari sana juga. Binding Python yang saya instal berasal dari situs yang berbeda (tidak dapat mengingat yang mana pada saat ini).
Ketika saya menginstal ulang GDAL dan Python Bindings semuanya dari gisinternals.com, saya berhasil membaca ReadAsArray.
Terima kasih untuk semua yang berkomentar dan menjawab dan saya minta maaf atas ketidaktahuan saya.
sumber
Mungkin ini masalah memori. Saat Anda menggunakan ReadAsArray, ia membawa data ke dalam memori, dan sementara 800mb tidak besar, itu juga tidak kecil. Sudahkah Anda mencoba membaca array dalam potongan?
Anda harus dapat mengulang-ulang array dan memprosesnya sekaligus, meskipun tergantung pada proses yang Anda lakukan, Anda mungkin harus membaca di area dengan tumpang tindih untuk menghindari efek tepi.
sumber
data = b.ReadAsArray(0,0, 500, 500)
dengan hasil yang sama.Maaf saya terlambat ke pesta ini, tetapi masalah dasar Anda adalah bahwa 32-bit Python tidak dapat menyimpan raster yang sangat besar dalam memori. Anda dapat membaca raster besar Anda ke memori dalam potongan ukuran gigitan, tetapi kemudian Anda cukup terbatas dalam hal apa yang dapat Anda proses secara efisien tanpa sangat tidak efisien / sering membaca / menulis ke disk.
Apa yang saya lakukan sebagai gantinya (yang mengorbankan efisiensi karena disk baca / tulis) adalah memanggil ( melalui pembungkus EXE ) versi gisinternals.com 64-bit dari metode gdal apa pun yang Anda butuhkan. Berhati-hatilah dengan menggunakan modul subproses python dalam satu lingkaran (yaitu Anda mungkin ingin / perlu memanggil subproses secara berurutan ) karena Anda mungkin secara tidak sengaja menghasilkan terlalu banyak utas terbuka untuk kotak jendela Anda dan mendapatkan peringatan sistem yang tidak menyenangkan. Anda mengorbankan sedikit cara untuk disk baca / tulis dengan pendekatan gdal ini, tetapi efisiensi pemrosesan Anda hanya turun (yaitu relatif terhadap perhitungan cepat dalam memori cepat , jika kotak / perpustakaan Anda dapat mendukungnya) sekitar faktor atau 10.
sumber