我试图在双时态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浮点数组也会引发内存错误。任何人都知道怎么解决这个问题?这是我的第一篇文章,所以任何有关如何发布的建议也会受到欢迎。
问候
答案 0 :(得分:1)
numpy
默认使用float64
,因此您的dm
- 阵列占用2GB内存(8 * 10 * 25000000),其他阵列可能大约200MB(~8 * 5000) * 5000)每个。
astype(float)
返回一个新数组,所以你也需要内存 - 甚至可能不需要,因为在将数据复制到结果数组时会隐式转换类型。
当释放for循环中使用的内存取决于垃圾回收。这不考虑GetRasterBand
,ReadAsArray
的内存开销。
您确定您的输入数据使用64位浮点数吗?如果它使用32位浮点数,则可以通过在数组上指定dtype='f'
来节省一半的内存使用量。