Python 大卫星图像处理
我试图在双时态RapidEye多光谱图像上运行Mort Canty的Python iMAD实现。这基本上是计算两幅图像的典型相关,然后减去它们。我的问题是 图像为5000 x 5000 x 5(波段)像素。如果我试着在上面运行这个 整个图像我得到一个记忆错误 使用pyTables之类的工具能帮我解决这个问题吗 Mort Canty的代码试图做的是使用gdal加载图像,然后存储它们 在10 x 25000000阵列中Python 大卫星图像处理,python,satellite-image,large-data,bigdata,Python,Satellite Image,Large Data,Bigdata,我试图在双时态RapidEye多光谱图像上运行Mort Canty的Python iMAD实现。这基本上是计算两幅图像的典型相关,然后减去它们。我的问题是 图像为5000 x 5000 x 5(波段)像素。如果我试着在上面运行这个 整个图像我得到一个记忆错误 使用pyTables之类的工具能帮我解决这个问题吗 Mort Canty的代码试图做的是使用gdal加载图像,然后存储它们 在10 x 25000000阵列中 # initial weights wt = ones(cols
# 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 25000000 numpy的浮点数组也会抛出一个内存错误。有人知道如何避开这个问题吗?这是我的第一篇帖子,所以任何关于如何发帖的建议都是欢迎的
问候语
numpy
在默认情况下使用float64
,因此您的dm
-数组占用2GB内存(8*10*25000000),其他数组可能每个大约200MB(~8*5000*5000)
astype(float)
返回一个新数组,因此也需要内存,甚至可能不需要内存,因为将数据复制到结果数组时会隐式转换类型
for循环中使用的内存何时释放取决于垃圾回收。这并没有考虑<代码> GeTraceBeope<代码>的内存开销,<代码> Read Stase
您确定您的输入数据使用64位浮点吗?如果它使用32位浮点,通过在数组中指定
dtype='f'
,可以轻松地将内存使用量减半。如果我将dtype指定为'f':回溯(最近一次调用):文件“C:\pythonxy\iMad.py”,第172行,在main()文件“C:\pythonxy\iMad.py”中,第79行,在main dm=0中((2*bands,cols*rows),dtype='f')MemoryError顺便问一下,我有8 GB的ram。有没有简单的方法,例如,用pytables将这些大数组写入hdf5文件,并像通常的numpy数组一样对它们进行操作?