为xarray.DataArray.values
打开的数据集运行open_mfdataset()
花费21秒。
从我用open_dataset()
打开的更大数组中获取值的速度要快1000倍以上。编辑:使用for循环遍历多个文件也比使用open_mfdataset()
快得多。请参阅底部的编辑。
您能帮我理解为什么会发生这种情况,或要寻找什么吗?如果我可以更快地打开40个netCDF,请进行一些选择,然后将所选数据导出到numpy?
我的代码遵循以下原则:
ds = xr.open_mfdataset(myfiles_list, concat_dim='new_dim')
ds = ds.sel(time=selected_date)
ds = ds.sel(latitude=slice([ymin, ymax]), longitude=slice([xmin, xmax]))
vals = ds['temperature'].values # this line takes 18.9 secs
# total time: 21 secs
# vals.shape = (40, 1, 26, 17)
vs
onefile = xr.open_dataset('/path/to/data/single_file.nc')
vals = onefile['temperature'].values # this line takes 0.005 secs
# total time: 0.018 secs
# vals.shape = (93, 40, 26, 17)
谢谢。
编辑-额外信息:
我应该澄清一下,这似乎是加载缓慢。调用values
时,以前是惰性的gets loaded数组。如果我插入一个明确的load()
命令,则加载速度很慢,但是values命令很快:
ds = xr.open_mfdataset(myfiles_list, concat_dim='new_dim')
ds = ds.sel(time=selected_date)
ds = ds.sel(latitude=slice([ymin, ymax]), longitude=slice([xmin, xmax]))
ds = ds.load() # this line takes 19 secs
vals = ds['temperature'].values # this line takes <10 ms
# total time: 21 secs
# vals.shape = (40, 1, 26, 17)
如果我不使用open_mfdataset()
,而是对文件列表进行for循环,从每个文件中提取一个numpy数组,并以numpy进行串联,则只需1秒钟。在此MWE中,这解决了我的整个问题,但是在我完整的代码中,我确实需要使用open_mfdataset()
:
list_of_arrays = []
for file in myfiles_list:
ds = xr.open_dataset(file)
ds = ds.sel(time=selected_date)
ds = ds.sel(latitude=slice([ymin, ymax]), longitude=slice([xmin, xmax]))
list_of_arrays.append(ds['temperature'].values)
vals = np.concatenate(list_of_arrays, axis=0)
# total time: 1.0 secs
# vals.shape = (40, 26, 17)
答案 0 :(得分:0)
xarray.open_mfdataset
将创建一个xarray.Datasets
的python列表,并在所有文件解析到列表后将它们连接起来。
因此,必须多次打开数据并将其存储到列表中。如果对代码进行概要分析,您将认识到文件解析花费的时间最多,但与文件的大小无关。因此,将文件放大2倍就不会花费2倍的时间来解析。最后,串联本身需要时间。