Python-Read非常大的栅格和绘图经验累积分布函数,内存错误

时间:2017-05-26 15:45:27

标签: python numpy memory raster cdf

我正在尝试绘制380Gb二进制栅格数据的经验累积分布函数(CDF)。仅使用一小块数据掩码,下面的代码就可以正常工作。

import numpy as np
import matplotlib.pyplot as plt
dem_name = open('./raster.dem','rb')
vals = np.fromfile(dem_name,dtype='float32')
vals = np.negative(vals[vals!=-9999])
vals = np.sort(vals)
y = np.arange(1.,len(vals)+1.)/len(vals)
plt.plot(vals,y)

但是,当我尝试使用此代码加载整个栅格时,显然会出现内存错误。我的计算机有9Tb的磁盘空间,但仅限于16Gb的RAM,因此我使用 numpy.memmap 将栅格值转换为数组。

dem_name = open('./raster.dem','rb')
vals = np.memmap(dem_name,dtype='float32','r')

这样可行,但我需要从光栅中修剪节点值(-9999),切换值的符号(负值变为正值)并将值从最低值排序到最高值。

vals_real = np.memmap(np.sort(np.negative(vals[vals!=-9999])))

这会运行几个小时,然后会出现内存错误

y数组,

y = np.arange(1.,len(vals)+1.)/len(vals)

也太大而无法存储在RAM中(给出内存错误),但我无法弄清楚如何将数组存储为memmap对象。

为了绘制内存还需要内存是否正确,这样我需要足够的磁盘空间,大小为光栅文件的2倍(2x 380Gb)?

总而言之,我需要将巨大的栅格读入python并绘制CDF。使用小光栅非常简单,但是我用这个完整的光栅制作这个图是不成功的。

我希望这个问题很明确。提前谢谢。

1 个答案:

答案 0 :(得分:0)

使用380Gb的单精度浮标,您有大约950亿个值。 不要尝试使用所有950亿个值来绘制ECDF。大多数绘图软件无法处理那么多点,即使可以,大多数显示器只有几千像素宽,因此绘制分辨率远高于此值的数据毫无意义。

相反,计算直方图,并批量工作。如果您已经知道文件中值的合理下限和上限,则可以预先分配直方图箱。否则,您可能需要一个直方图算法,该算法可以适应每批中到达的新数据。