我正在尝试使用 xarray 中的
open_mfdataset
函数打开大量 NetCDF 文件(340 GB,7,000 多个文件)。然而,当我尝试将所有这些文件名的排序列表读入 open_mfdataset
时,需要很长时间(约 30 分钟)才能完成。考虑到我要读取的内容的大小,这可能是预期的行为,但据我所知,大部分计算时间应该发生在我按照自己的方式处理数据集然后最终调用 .compute()
之后
open_mfdataset
应该花这么长时间吗?有什么办法可以加快速度吗?我知道存在“块”的争论,但我的理解是,只有当我在超级计算机上进行并行计算时,这才真正相关......
一些示例代码...
import numpy as np
import xarray as xr
from glob import glob
files = np.sort(glob('filepath/*.nc'))
print(len(files))
>>> 7479
ds = xr.open_mfdataset(files)
如果我只加载一个文件,数据集会是什么样子......
ds = xr.open_dataset(files[0])
print(radar_data)
<xarray.Dataset>
Dimensions: (bounds: 2, time: 1, x0: 301, y0: 301, z0: 30)
Coordinates:
* time (time) datetime64[ns] 2018-08-20T00:31:32
* x0 (x0) float32 -150.0 -149.0 -148.0 ... 148.0 149.0 150.0
* y0 (y0) float32 -150.0 -149.0 -148.0 ... 148.0 149.0 150.0
lat0 (y0, x0) float32 18.32 18.32 18.32 ... 21.01 21.01 21.01
lon0 (y0, x0) float32 120.8 120.8 120.8 ... 123.7 123.7 123.7
* z0 (z0) float32 0.5 1.0 1.5 2.0 2.5 ... 13.5 14.0 14.5 15.0
Dimensions without coordinates: bounds
Data variables:
data (time, z0, y0, x0) float32 ...
我也遇到了这个问题,我的解决方案是使用多处理,因为 dask parallel=True 似乎每次尝试都会导致读取速度变慢。
获得文件列表后,使用 multiprocessing 使用 xr_opendataset 读取每个文件,然后根据需要进行一些处理。
然后在 xarray 结果列表上调用 xr.concat。
相对于使用 open_mfdataset,速度提高了 3 倍或 4 倍
我也遇到过同样的问题,我的解决方案是显式初始化
dask.distributed.Client
并在 parallel=True
中设置 xr.open_mfdataset
。
import glob
import os
import dask
import numpy as np
import xarray as xr
from dask.distributed import Client
client = Client(n_workers=20, threads_per_worker=2, memory_limit='10GB')
# client = Client() # This doesn't work, and I don't know why
fpaths = np.sort(glob.glob("*.nc"))
ds = xr.open_mfdataset(fpaths, combine="nested", concat_dim="time", parallel=True)
# CPU times: user 2min 54s, sys: 24.5 s, total: 3min 19s
# Wall time: 4min 26s
该数据集包含约 6000 个文件,总计约 380GB。