我试图处理非常大的netCDF文件(每个约400 GB)。每个文件都有几个变量,所有变量都比系统内存大得多(例如180 GB vs 32 GB RAM)。我尝试使用numpy和netCDF4-python对这些变量执行一些操作,通过逐个拷贝切片并对其进行操作。不幸的是,仅读取每个切片就需要很长时间,这影响了性能。
例如,其中一个变量是形状为
例如,其中一个变量是形状为
(500、500、450、300)
的数组。我想要操作切片[:,:,0]
,所以我按照以下方式操作:import netCDF4 as nc
f = nc.Dataset('myfile.ncdf','r+')
myvar = f.variables['myvar']
myslice = myvar[:,:,0]
但最后一步需要很长时间才能完成(在我的系统上大约需要5分钟)。例如,如果我将一个形状为(500, 500, 300)
的变量保存到netcdf文件中,那么同样大小的读操作只需要几秒钟。
有没有方法可以加快速度?一个显而易见的路径是转置数组,使我选择的索引出现在前面。但在这样一个大文件中,这不可能在内存中完成,而且即使已经花费了很长时间来执行简单的操作,尝试它似乎也更慢。我想要的是一种快速读取netcdf文件切片的方法,类似于Fortran的get_vara函数接口。或者一些有效地转置数组的方法。
xarray
模块:它提供了一个非常好的接口来处理dask
的内存外数组。 - j08lue