NetCDF 大数据

Posted

技术标签:

【中文标题】NetCDF 大数据【英文标题】:NetCDF Big data 【发布时间】:2016-05-24 10:27:32 【问题描述】:

我需要将大型 (+15GB) NetCDF 文件读入一个程序,该程序包含一个 3D 变量(等时间作为记录维度,数据是纬度乘经度)。

我在 3 级嵌套循环中处理数据(检查 NetCDF 的每个块是否通过特定条件。例如;

from netCDF4 import Dataset                   
import numpy as np

File = Dataset('Somebigfile.nc', 'r')
Data = File.variables['Wind'][:]

Getdimensions = np.shape(Data)
Time = Getdimensions[0]
Latdim  = Getdimensions[1]
Longdim = Getdimensions[2]

for t in range(0,Time):
    for i in range(0,Latdim):
        for j in range(0,Longdim):

            if Data[t,i,j] > Somethreshold:
                #Do something

我是否可以一次读取 NetCDF 文件中的一次记录?大大减少内存使用。非常感谢任何帮助。

我知道 NCO 操作员,但不希望在使用脚本之前使用这些方法来分解文件。

【问题讨论】:

自己解决了;在循环内使用 Data = File.variables['Wind'][:]。 【参考方案1】:

听起来您已经确定了一个解决方案,但我将提出一个使用xarraydask 的更优雅和矢量化(可能更快)的解决方案。您的嵌套 for 循环将非常低效。结合xarraydask,您可以在半向量化庄园中增量处理文件中的数据。

由于您的Do something 步骤不是那么具体,因此您必须从我的示例中推断。

import xarray as xr

# xarray will open your file but doesn't load in any data until you ask for it
# dask handles the chunking and memory management for you
# chunk size can be optimized for your specific dataset.
ds = xr.open_dataset('Somebigfile.nc', chunks='time': 100)

# mask out values below the threshold
da_thresh = ds['Wind'].where(ds['Wind'] > Somethreshold)

# Now just operate on the values greater than your threshold
do_something(da_thresh)

Xarray/Dask 文档:http://xarray.pydata.org/en/stable/dask.html

【讨论】:

感谢您的回答。我的解决方案还不错,因为 netcdf 文件的读取发生在每个时间步(循环的第一级,而不是第三个最嵌入的级别);无论如何,循环内的处理需要大约 30 秒,因此从磁盘与内存读取 1 秒的额外头部并不会太痛苦。不过建议很好,看起来效率更高。

以上是关于NetCDF 大数据的主要内容,如果未能解决你的问题,请参考以下文章

加快在python中读取非常大的netcdf文件

具有大数据的数据库与文件系统存储

经纬度子集的 netcdf4 提取

netcdf4-python:随着从 netcdf 对象多次调用切片数据,内存增加

Python提取netCDF数据并转换为csv文件

如何最好地将 NetCDF 文件集合重新分块到 Zarr 数据集