我试图从一个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,所以我使用了numpy.memmap将光栅值放入数组中。在
^{pr2}$
这是可行的,但我需要从光栅中修剪nodata值(-9999),切换值的符号(负值变为正值),并将值从最低值排序到最高值。在vals_real = np.memmap(np.sort(np.negative(vals[vals!=-9999])))
这会运行几个小时,然后产生一个内存错误。在
y数组y = np.arange(1.,len(vals)+1.)/len(vals)
也太大,无法存储在RAM中(导致内存错误),但我无法确定如何将数组存储为memmap对象。在
为了打印也需要内存,这样我就需要足够的磁盘空间来容纳光栅文件的两倍大小(2x380GB),这是正确的吗?在
总而言之,我需要将巨大的光栅读入python并绘制CDF。用一个小光栅很简单,但我用完整的光栅绘制这个图并不成功。在
我希望这个问题是清楚的。提前谢谢。在