我正在尝试绘制来自 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')
这有效,但我需要从栅格中修剪 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 对象。
为了绘图也需要内存,这样我就需要足够的磁盘空间来容纳光栅文件大小的 2 倍 (2x 380Gb),这是否正确?
所以总而言之,我需要将巨大的光栅读入python并绘制一个CDF。使用小光栅非常简单,但是使用完整光栅制作此图一直没有成功。
我希望这个问题是清楚的。提前谢谢。
使用 380Gb 的单精度浮点数,您有大约 950 亿个值。 不要尝试使用所有 950 亿个值绘制 ECDF。 大多数绘图软件无法处理那么多点,即使可以,大多数显示器也只有几千像素宽,因此绘制分辨率远高于此的数据是没有意义的。
相反,请计算直方图,并分批工作。 如果您已经知道文件中值的合理下限和上限,则可以预分配直方图箱。 否则,您可能需要一个直方图算法来适应每批到达的新数据。