【问题标题】:Big Satellite Image Processing大卫星图像处理
【发布时间】:2012-05-21 15:33:41
【问题描述】:

我正在尝试在双时相 RapidEye 多光谱图像上运行 Mort Canty 的 http://mcanty.homepage.t-online.de/ Python iMAD 实现。它基本上计算了两个图像的典型相关,然后减去它们。我遇到的问题是 图像的大小为 5000 x 5000 x 5(条带)像素。如果我尝试运行它 整个图像我得到一个内存错误。

使用 pyTables 之类的东西对我有帮助吗?

Mort Canty 的代码试图做的是它使用 gdal 加载图像然后存储它们 在 10 x 25,000,000 数组中。

    # initial weights
    wt = ones(cols*rows)      
    # data array (transposed so observations are columns)
    dm = zeros((2*bands,cols*rows))
    k = 0
    for b in pos:
    band1 = inDataset1.GetRasterBand(b+1)
    band1 = band1.ReadAsArray(x0,y0,cols,rows).astype(float)
    dm[k,:] = ravel(band1)
    band2 = inDataset2.GetRasterBand(b+1)
    band2 = band2.ReadAsArray(x0,y0,cols,rows).astype(float)        
    dm[bands+k,:] = ravel(band2)
    k += 1

即使只是创建一个 10 x 25,000,000 的 numpy 浮点数组也会引发内存错误。任何人都知道如何解决这个问题?这是我的第一篇文章,所以也欢迎任何关于如何发帖的建议。

问候

【问题讨论】:

    标签: python satellite-image large-data bigdata


    【解决方案1】:

    numpy 默认使用 float64,因此您的 dm-array 占用 2GB 内存 (8*10*25000000),其他阵列可能每个大约 200MB (~8*5000*5000)。

    astype(float) 返回一个新数组,因此您也需要内存 - 甚至可能不需要内存,因为在将数据复制到结果数组时会隐式转换类型。

    何时释放 for 循环中使用的内存取决于垃圾回收。而且这里没有考虑GetRasterBandReadAsArray的内存开销。

    您确定您的输入数据使用 64 位浮点数吗?如果它使用 32 位浮点数,您可以通过在数组上指定 dtype='f' 轻松将内存使用量减半。

    【讨论】:

    • 如果我将 dtype 指定为“f”,我仍然会出现内存错误:回溯(最近一次调用最后一次):文件“C:\pythonxy\iMad.py”,第 172 行,在 main() 文件“C:\pythonxy\iMad.py”,第 79 行,在 main dm = zeros((2*bands,cols*rows),dtype='f') MemoryError 顺便说一句,我有 8 gbs 的内存.是否有任何简单的方法可以例如将这些大数组写入带有 pytables 的 hdf5 文件并像通常的 numpy 数组一样对其进行操作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2017-02-17
    • 2013-02-09
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    相关资源
    最近更新 更多