我正在尝试运行 Mort Canty 的 http://mcanty.homepage.t-online.de/ Python iMAD 在双时态 RapidEye 多光谱图像上的实现。这基本上计算了两个图像的典型相关性,然后将它们相减。我遇到的问题是 图像为 5000 x 5000 x 5( strip )像素。如果我尝试运行它 整个图像出现内存错误。
使用像 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 float 组也会引发内存错误。任何人都知道如何解决这个问题?这是我的第一篇文章,因此也欢迎任何关于如何发表的建议。
问候
请您参考如下方法:
numpy 默认使用 float64,因此您的 dm-array 占用 2GB 内存(8*10*25000000),另一个每个数组大约 200MB (~8*5000*5000)。
astype(float) 返回一个新数组,因此您也需要内存 - 甚至可能不需要,因为在将数据复制到结果数组时会隐式转换类型。
for 循环中使用的内存何时被释放取决于垃圾收集。这还没有考虑 GetRasterBand、ReadAsArray 的内存开销。
您确定您的输入数据使用 64 位 float 吗?如果它使用 32 位 float ,您可以通过在数组上指定 dtype='f' 轻松地将内存使用减半。
