Gdal Dataset.ReadAsArray () Python'u çökertiyor


13

Windows 7 64bit üzerinde Numpy 1.3 ve Gdal 1.9.1 yüklü Python 2.6.5 (32bit) kullanıyorum. Bazı raster cebir yapmak için Numpy dizisine 800 MB Imagine (.img) raster veri kümesini okumaya çalışıyorum, ancak en kısa sürede aşağıdaki kodu çalıştırmak, Python.exe çöküyor.

from osgeo import gdal

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

Python.exe b.ReadAsArray()çağrı üzerine çöküyor . Google'da bazı aramalar yaptım ve Windows 7 64bit ile ilgili bu sorundan bahseden Gdal 1.6'dan tarihli makaleler buldum, ancak o zamanın en son geliştirme sürümlerinde düzeltildiğini de belirtti.

Başka kimse bu sorunu yaşadı mı? Herhangi bir geçici çözüm var mı?

GÜNCELLEME:

Nerede başarısız olduğunu belirlemek için PyDev kodu hata ayıklamaya karar verdim. Ne söyleyebilirim (hala herhangi bir hata mesajı alamıyorum) gdal_array.py satır 22 başarısız.

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

Yukarıdaki kod satırına girdiğimde, beni numpy'nin init .py modülüne getiriyor . Uyuşturucunun sonuna geldiğimde. __ init __ .py modülü, yukarıdaki kod satırına geri döner. Sonra, gdal_array.py içindeki bir sonraki satıra getirmem gereken düğmeye bastığımda, komut dosyası hiçbir hata iletisi veya herhangi bir şey olmadan sonlandırılıyor.

GÜNCELLEME # 2:

GDAL 1.9.1'i kaldırdım ve GDAL 1.6.1'i Python Cheeseshop ve OSGeo'nun Windows Binaries'den kurdum. Hala aynı sorun vardı.


Bu sorunu yaşıyordum. Gis.internals adresindeki Tamas'ın gdal python bağlarını mı kullanıyorsunuz? Öyleyse, eklemelerinizi PATH'nize öne taşıyın. Başka bir kütüphane benim için bir soruna neden oluyordu.
Jay Laura

İçlerinden indirdiğime inanıyorum. Yarın ofise geldiğimde yolumu ayarlamaya çalışacağım. Tavsiye için teşekkürler.
Brian

1
Bu işe yaramazsa, son zamanlarda bu paketleri kullanmaya geçtim
Jay Laura

Sistem Yolu'nda (Windows'ta PATH ortam değişkeni) hiçbir şey yapmadan hareket etmeyi denedim. Ayrıca GDAL sürümümü kaldırdım ve verdiğiniz bağlantıya GDAL sürümünü yükledim ve aynı sorunu yaşadım.
Brian

Hmmm .... bağlandığım versiyon sadece bağlamalardı, bu yüzden Tamas'tan GDAL çekirdeğine sahip olmanız gerekiyor. Diğer çağrılar olsa çalıştı, bu iyi çalışıyor. Denemek için üç şey uzun çekimlerdir ('uzunluk' sırasına göre.1) Numpy sürümünüzü güncelleyin. 2) gdal_translate ve gtiff kodunu deneyin. 3) .astype (numpy.float32) ile ReadAsArray () öğesini ekleyin. Görüntü herkese açık mı? Makinemde test edebilirim. Bunlardan hiçbiri işe yaramazsa yığın izlemesini gönderebilir misiniz?
Jay Laura

Yanıtlar:


5

Birçok yorumcunun şüphelendiği gibi, bu benim yüklememle ilgili bir sorundu. Görünüşe göre, GDAL ve Python Bağlamaları kurarken yeterince dikkat etmiyordum.

GDAL Core ve eklentileri (dll) gisinternals.com'dan yükledim, ama bir şekilde Python Bindings'i oradan da kurmayı düşünmedim. Yüklediğim Python Bağlamaları farklı bir siteden (bu noktada hangisini hatırlayamıyorum).

GDAL ve Python Ciltlerini gisinternals.com'dan yeniden yüklediğimde, başarıyla ReadAsArray'ı başardım.

Yorum yapan ve cevap veren herkese teşekkür ederim ve cehaletim için özür dilerim.


3

Bu bir hafıza sorunu olabilir. ReadAsArray kullandığınızda verileri belleğe taşır ve 800mb çok büyük olmasa da, küçük de değildir. Diziyi parçalar halinde okumayı denediniz mi?

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

Dizi boyunca döngü yapmalı ve bir seferde yığın halinde işleyebilmelisiniz, ancak yaptığınız işleme bağlı olarak, kenar efektlerini önlemek için muhtemelen örtüşme olan alanlarda okumaya bakmalısınız.


Parçalar kullanmayı denedim. data = b.ReadAsArray(0,0, 500, 500)Aynı sonucu denedim .
Brian

Hmm. Başka görüntü formatlarını denediğinizi mi sanıyorum? Ayrıca, belirli bir hata mesajı var mı?
om_henners

Henüz başka bir format denemedim. hiçbir hata mesajı, sadece "python.exe çalışmayı durdurdu" dedi bir açılır pencere yoktu.
Brian

Bu sabah .img dosyasını bir GeoTIFF'e dönüştürdüm ve tekrar denedim. Şanssız.
Brian

Dosyayı gdal'dan bellek eşlemenin bir yolu var mı?
CMCDragonkai

1

Maalesef bu partiye geç kaldım, ancak temel probleminiz 32 bit Python'un çok büyük rasterleri bellekte depolayamaması. Büyük rasterinizi ısırık boyutlu parçalar halinde belleğe okuyabilirsiniz, ancak daha sonra diske aşırı verimsiz / sık okuma / yazma olmadan verimli bir şekilde işleyebileceğiniz şeyler açısından oldukça sınırlandırılırsınız.

Bunun yerine (disk okuma / yazma nedeniyle bazı verimliliği feda eden) ne yaptığım (ihtiyacınız olan gdal yöntemi 64-bit gisinternals.com sürümünü ( EXE sarma yoluyla ) çağırmaktır . Yanlışlıkla Windows kutunuz için çok fazla açık iş parçacığı oluşturabileceğiniz ve uğursuz sistem uyarıları alabileceğiniz için, python'un alt işlem modülünü bir döngüde kullanmaya dikkat edin (yani, alt işlemi sırayla çağırmanız gerekebilir / gerekebilir ). Bu gdal yaklaşımıyla disk okuma / yazma yolunda biraz fedakarlık yaparsınız, ancak işlem verimliliğiniz sadece ( kutunuz / kütüphaneniz destekleyebiliyorsa, hızlı bir bellek içi hesaplamaya göre) yaklaşık bir faktör veya 10.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.