2

我试图在双时相 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 浮点数组也会引发内存错误。任何人都知道如何解决这个问题?这是我的第一篇文章,所以任何关于如何发布的建议也将受到欢迎。

问候

4

1 回答 1

1

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

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

何时释放 for 循环中使用的内存取决于垃圾收集。这不考虑 , 的内存GetRasterBand开销ReadAsArray

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

于 2012-05-14T08:05:33.797 回答