[英]python xarray write to netcdf file very slow
for fname in ids['fnames']:
aq = xr.open_dataset(fname, chunks='auto', mask_and_scale=False)
aq = aq[var_lists]
aq = aq.isel(lat=slice(yoff, yoff+ysize), lon=slice(xoff, xoff+xsize))
list_of_ds.append(aq)
aq.close()
all_ds = xr.concat(list_of_ds, dim='time')
all_ds.to_netcdf('tmp.nc')
大家好,我正在使用 xarray 讀取 .netcdf 文件(大約 1000 個)並將選定的結果保存到一個臨時文件中,如上所示。 但是,保存部分運行很慢。 我怎樣才能加快速度?
我也試過直接加載數據,但還是很慢。
我也嘗試過將open_mfdataset
與parallel=True
一起使用,而且速度也很慢:
aq = xr.open_mfdataset(
sorted(ids_list),
data_vars=var_lists,
preprocess=add_time_dim,
combine='by_coords',
mask_and_scale=False,
decode_cf=False,
parallel=True,
)
aq.isel({'lon':irlon,'lat':irlat}).to_netcdf('tmp.nc')
不幸的是,在 xarray 中連接 ~1000 個文件會很慢。 不是解決這個問題的好方法。
如果沒有關於您的數據和設置的更多詳細信息,我們很難提供具體建議。 但這里有一些我會嘗試的事情:
xr.open_mfdataset
。 您的第二個代碼塊看起來不錯。 與使用 for 循環相比,dask 在管理任務方面通常會更快、更有效。chunks={"lat": 50, "lon": 50}
. 您需要在這里平衡一些事情 - 確保塊大小是可管理的並且不會太小(導致太多任務)。 作為一般規則,拍攝 ~100-500 MB 范圍內的塊,並嘗試將任務數量保持在 100 萬以下(或所有數據集中的 # 塊小於 ~10-100k)。combine='nested'
比'by_coords'
執行得更好,因此如果您要連接沿一個或多個維度邏輯結構化的文件,它可能有助於以提供 dim 的相同方式排列文件。combine='by_coords'
,其中坐標是早期 dask 操作的結果。 如果您需要為每個文件附加一個時間維度,每個文件有 1 個元素,例如xr.open_mfdataset(files, concat_dim=pd.Index(pd.date_range("2020-01-01", freq="D", periods=1000), name="time"), combine="nested")
根據我的經驗,效果很好。 如果這一切花費的時間太長,您可以嘗試預處理數據。 使用像nco
這樣的編譯實用程序,或者甚至只是使用dask.distributed
的 client.map 對數據進行子集化並將較小的數據子集分組到較大的文件中,可能有助於降低最終數據集連接的復雜性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.