![](/img/trans.png)
[英]Notebook kernel dies when saving multiple netCDF files with xarray
[英]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.