大卫星图像处理(Big Satellite Image Processing)

2019-06-24 09:37发布

我试着去运行莫特活泼的http://mcanty.homepage.t-online.de/于双颞RapidEye多光谱图像的Python伊马德实施。 基本上计算两个图像中的典型相关,然后substracts他们。 时遇到的问题是,图像是5000 X 5000×5(频带)的像素。 如果我试图在整个图像上运行此我得到一个内存错误。

将使用类似pyTables帮助我?

什么莫特活泼的代码试图做的是,它加载使用@中的图像,然后将它们存储在一个10×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×25000000 numpy的数组抛出的存储器错误。 任何人对如何解决这个问题是一个好主意? 这是我的第一篇有史以来等如何发布也将受到欢迎任何建议。

问候

Answer 1:

numpy使用float64每默认的,所以你的dm -array占用了2GB的内存(8 * 10 * 25000000),其他阵列大概有200MB(〜8 * 5000 * 5000)的每个。

astype(float)返回一个新的数组,所以您需要为内存以及-也许甚至不需要为数据复制到结果数组类型时,隐式转换。

当在for循环被释放使用的内存取决于垃圾收集。 这不考虑的内存开销GetRasterBandReadAsArray

是您确认您输入的数据采用64位浮点数? 如果使用32位浮点,可以通过指定easyliy的内存使用量的一半dtype='f'在你的阵列。



文章来源: Big Satellite Image Processing