Python-读取非常大的栅格并绘制经验累积分布函数,内存错误

Python-Read very large raster and plot empirical cumulative distribution function, memory error

我正在尝试绘制 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 的磁盘 space 但仅限于 16Gb 的 RAM,因此我使用 numpy.memmap 将栅格值放入数组中。

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

这可行,但我需要 trim 栅格中的无数据值 (-9999),切换值的符号(负值变为正值)并将值从最低到最高排序。

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

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

y数组,

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

也太大而无法存储在 RAM 中(出现内存错误),但我不知道如何将数组存储为内存映射对象。

为了绘图也需要内存,这样我需要足够的磁盘 space 来存储光栅文件大小的 2 倍(2x 380Gb),这是否正确?

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

我希望这个问题很清楚。提前致谢。

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

而是计算直方图,然后分批处理。如果您已经知道文件中值的合理下限和上限,则可以预分配直方图 bin。否则,您可能需要一种直方图算法来适应每批到达的新数据。