Gdal Dataset.ReadAsArray()使Python崩溃


12

我正在将Python 2.6.5(32bit)与Numpy 1.3和Gdal 1.9.1安装在Windows 7 64bit上。我试图将800 MB想象(.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()

Python.exe在b.ReadAsArray()调用时崩溃。我在Google上进行了一些搜索,发现了Gdal 1.6上的文章,其中提到了Windows 7 64bit的该问题,但他们还提到当时该问题已在最新的开发版本中修复。

其他人遇到过这个问题吗?任何解决方法?

更新:

我决定在PyDev中调试代码,以尝试确定失败的地方。据我所知(仍然没有收到任何错误消息),它在gdal_array.py的第22行上失败了。

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

当我进入上面的代码行时,它带我进入numpy 的init .py模块。当我到达numpy的结尾时。__ init __ .py模块,它跳回到上面的代码行。然后,当我按下“进入”按钮时,应该将我带到gdal_array.py中的下一行,该脚本只是终止而没有任何错误消息或任何内容。

更新#2:

我从Python Cheeseshop和OSGeo的Windows Binaries中卸载了GDAL 1.9.1,并安装了GDAL 1.6.1。仍然有同样的问题。


我要遇到这个问题。您是否正在gis.internals使用Tamas的gdal python绑定?如果是这样,请将添加到PATH的内容移到最前面。其他图书馆给我造成了一些问题。
杰伊·劳拉

我相信我确实是从他的内部下载的。明天我到办公室时,我将尝试调整自己的道路。谢谢你的建议。
布莱恩(Brian)

1
如果那行不通,我最近改用了这些软件包-lfd.uci.edu/~gohlke/pythonlibs
Jay Laura

我尝试在我的系统路径(Windows中的PATH环境变量)中四处移动,但是没有运气。我还卸载了我的GDAL版本,并在您提供的链接上安装了GDAL版本,但仍然存在相同的问题。
布莱恩(Brian)

嗯...我链接到的版本只是绑定,所以您仍然需要Tamas提供GDAL内核。如果其他调用仍然有效,则工作正常。要尝试的三件事是长镜头(按“长度”的顺序。)1)更新您的Numpy版本。2)将gdal_translate转换为gtiff,然后尝试对该图像进行编码。3)将ReadAsArray()附加为.astype(numpy.float32)。图片公开吗?我可以在我的机器上测试它。如果这些都不起作用,您可以发布堆栈跟踪信息吗?
杰伊·劳拉

Answers:


5

正如许多评论者所怀疑的那样,这是我安装的问题。显然,在安装GDAL和Python绑定时,我没有给予足够的重视。

我从gisinternals.com安装了GDAL Core和插件(dll),但不知为什么我也不想从那里安装Python绑定。我安装的Python绑定来自另一个站点(目前不记得是哪个站点)。

当我从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 2012年

我还没有尝试过其他格式。没有错误消息,只是一个弹出窗口,提示“ python.exe已停止工作”。
Brian

我今天早上将.img文件转换为GeoTIFF,然后重试。没运气。
布赖恩

有没有办法存储来自gdal的文件映射?
CMCDragonkai'3

1

抱歉,我参加这个聚会很晚,但是您的基本问题是32位Python无法在内存中存储很大的栅格。您可以按位大小的块将大的光栅读取到内存中,但是在可以高效处理的内容方面却受到相当有限的限制,而无需对磁盘进行极其低效/频繁的读/写。

我要做的(由于磁盘读/写而牺牲了一些效率)是调用(通过EXE换行)所需的任何gdal方法的64位gisinternals.com版本。在循环中使用python的subprocess模块​​时要小心(即,您可能希望/需要顺序调用subprocess),因为您可能会无意中为Windows框生成过多的打开线程并得到不祥的系统警告。通过这种方法,您在磁盘读/写的方式上有所牺牲,但是您的处理效率仅下降了大约一个因素(即,相对于快速的内存中计算,如果您的存储盒/库可以支持的话)。 10。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.