我正在尝试绘制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。使用小光栅非常简单,但是我用这个完整的光栅制作这个图是不成功的。
我希望这个问题很明确。提前谢谢。
答案 0 :(得分:0)
使用380Gb的单精度浮标,您有大约950亿个值。 不要尝试使用所有950亿个值来绘制ECDF。大多数绘图软件无法处理那么多点,即使可以,大多数显示器只有几千像素宽,因此绘制分辨率远高于此值的数据毫无意义。
相反,计算直方图,并批量工作。如果您已经知道文件中值的合理下限和上限,则可以预先分配直方图箱。否则,您可能需要一个直方图算法,该算法可以适应每批中到达的新数据。