簡體   English   中英

python xarray 寫入 .netcdf 文件非常慢

[英]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_mfdatasetparallel=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 在管理任務方面通常會更快、更有效。
  • 確保您的塊與您分割數據的方式保持一致。 您不想閱讀更多內容。 如果您正在閱讀 .netCDF,您可以靈活地了解如何將數據讀入 dask。 由於您正在選擇(看起來像)每個數組中的一個小空間區域,因此顯式分塊數據可能是有意義的,這樣您只讀取每個數組的一小部分,例如使用chunks={"lat": 50, "lon": 50} . 您需要在這里平衡一些事情 - 確保塊大小是可管理的並且不會太小(導致太多任務)。 作為一般規則,拍攝 ~100-500 MB 范圍內的塊,並嘗試將任務數量保持在 100 萬以下(或所有數據集中的 # 塊小於 ~10-100k)。
  • 明確你的串聯。 這個過程感覺越“神奇”,xarray 為推斷您的意思所做的工作就越多。 通常, combine='nested''by_coords'執行得更好,因此如果您要連接沿一個或多個維度邏輯結構化的文件,它可能有助於以提供 dim 的相同方式排列文件。
  • 跳過預處理。 如果可以,請在串聯時添加新維度,而不是作為攝取步驟。 這允許 dask 更全面地計划計算,而不是將您的預處理 function 視為黑盒,更糟糕的是作為安排最終數組構造操作的先決條件,因為您使用的是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM