簡體   English   中英

使用 xarray/dask 中的多個 netcdf 文件分塊時的意外行為

[英]Unexpected behaviour when chunking with multiple netcdf files in xarray/dask

我正在使用一組 468 個 netcdf 文件,總大小為 12GB。 每個文件只有一個地球物理變量的全局快照,即每個文件的數據形狀是(1, 1801, 3600)對應於維度('time', 'latitude', 'longitude')

我的 RAM 是 8GB,所以我需要分塊。 我正在使用xarray.open_mfdataset創建一個 xarray 數據集,我發現在調用xarray.open_mfdataset或使用方法.chunk進行重新分塊時使用參數塊具有完全不同的結果。 這里報告了一個類似的問題,沒有得到任何回應。

從 xarray 文檔中,調用xarray.open_dataset或使用.chunk分塊時的分塊應該完全相同......

http://xarray.pydata.org/en/stable/dask.html 在此處輸入圖像描述

……但似乎並非如此。 我在這里分享我的例子。

1) 沿空間維度(經度、緯度) xarray.open_mfdataset時分塊,時間維度未分塊。

import xarray as xr

data1 = xr.open_mfdataset('/data/cds_downloads/2m_temperature/*.nc',
                          concat_dim='time', combine='nested',
                          chunks = {'longitude':400, 'latitude':200}) \
                         .chunk({'time':-1})
data1.t2m.data

在此處輸入圖像描述

with ProgressBar():
    data1.std('time').compute()

[########################################] | 100% Completed |  5min 44.1s

在這種情況下,一切正常。

2) 使用方法.chunk沿空間維度(經度、緯度)進行分塊,而時間維度未分塊。

data2=xr.open_mfdataset('/data/cds_downloads/2m_temperature/*.nc',
                        concat_dim='time',combine='nested') \
                       .chunk({'time': -1, 'longitude':400, 'latitude':200})
data2.t2m.data

在此處輸入圖像描述

如圖所示,顯然現在的分塊與 1) 中的完全相同。 然而...

with ProgressBar():
    data2.std('time').compute()

[#####################################   ] | 93% Completed |  1min 50.8s

... std 的計算無法完成,jupyter 筆記本 kernel 由於超出 memory 限制而沒有消息而死,因為我可以使用htop檢查監視 ...這可能意味着分塊確實沒有發生在現實中沒有塊的數據集正在加載到 memory。

3) 沿空間維度(經度、緯度)調用xarray.open_mfdataset時進行分塊,並保留默認分塊的時間維度(每個文件一個塊)。

從理論上講,這種情況應該比 1) 慢得多,因為std的計算是沿時間維度完成的,因此不必要地生成了更多的塊(現在 421420 個塊與 (1) 中的 90 個塊)。

data3 = xr.open_mfdataset('/data/cds_downloads/2m_temperature/*.nc',
                          concat_dim='time', combine='nested',
                          chunks = {'longitude':400, 'latitude':200})
data3.t2m.data

在此處輸入圖像描述

with ProgressBar():
    data3.std('time').compute()

[########################################] | 100% Completed |  5min 51.2s

然而,沒有 memory 問題,計算所需的時間幾乎與情況 1) 相同。 這再次表明方法.chunk似乎無法正常工作。

任何人都知道這是否有意義或如何解決這個問題? 我需要能夠根據我需要做的具體計算來改變分塊。

謝謝

PD:我正在使用 xarray 版本 0.15.1

我需要能夠根據我需要做的具體計算來改變分塊。

是的,計算將對塊結構高度敏感。

在計算中盡可能早地進行分塊(最好是在您讀取數據時)是理想的,因為這使整體計算更簡單。

一般來說,我推薦更大的塊大小。 請參閱https://docs.dask.org/en/latest/best-practices.html#avoid-very-large-graphs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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