2016-05-19 71 views
4

所以我有3個netcdf4文件(每個大約90 MB),我想使用包xarray連接。每個文件有一個以0.5度分辨率(lat,lon)表示365天(時間)的變量(dis)。我的目標是連接這三個文件,以便我們有一個1095天(3年)的時間序列。Python xarray.concat然後xarray.to_netcdf生成巨大的新文件大小

每個文件(2007年以來,2008年,2009年)有: 1變量:DIS 3座標:時間,緯度,經度......這樣

<xarray.Dataset> 
Dimensions: (lat: 360, lon: 720, time: 365) 
Coordinates: 
    * lon  (lon) float32 -179.75 -179.25 -178.75 -178.25 -177.75 -177.25 ... 
    * lat  (lat) float32 89.75 89.25 88.75 88.25 87.75 87.25 86.75 86.25 ... 
    * time  (time) datetime64[ns] 2007-01-01 2007-01-02 2007-01-03 ... 
Data variables: 
    dis  (time, lat, lon) float64 nan nan nan nan nan nan nan nan nan ... 

我讓他們進口和使用concat模塊來連接,我想成功了。在這種情況下,模塊讀出從filestrF

3個的NetCDF文件名
flist1 = [1,2,3] 
ds_new = xr.concat([xr.open_dataset(filestrF[0,1,1,f]) for f in flist1],dim='time') 

新的數據集的新細節都顯示現在是:

Dimensions: (lat: 360, lon: 720, time: 1095) 

似乎沒什麼問題。但是,當我將這個數據集寫回到netcdf時,文件大小現在已經爆炸,1年的數據看起來相當於700 MB。

ds_new.to_netcdf('saved_on_disk1.nc') 
  • 對於2頁連接起來的文件,〜1.5 GB
  • 對於3 ,, ,, 2.2 GB
  • 對於4 ,, ,, 2.9 GB

我本來期望3 x 90 MB = 270 MB - 因爲我們在一個維度(時間)上縮放(3x)。變量dis和其他維度lat和lon的大小保持不變。

任何想法,請爲巨大的高檔尺寸?我已經測試了在沒有連接的情況下讀入和寫回文件,並且成功地完成了這個操作,而不增加大小。

回答

5

您開始使用的netCDF文件是壓縮的,可能使用了netCDF4的塊壓縮功能。

當您讀取單個數據集並將其寫回磁盤時,xarray會使用相同的壓縮設置將該數據寫回。但是,當您合併多個文件時,壓縮設置將被重置。部分原因是不同的文件可能以不同的方式壓縮在磁盤上,所以如何處理組合結果並不明顯。

要保存壓縮的新netCDF文件,使用encoding說法,as described在xarray文檔:

ds_new.to_netcdf('saved_on_disk1.nc', encoding={'dis': {'zlib': True}}) 

你可能還需要基於對你的期望的訪問模式,手動指定chunksizes參數數據。

如果您好奇這些文件最初是如何壓縮的,則可以從encoding屬性中提取該信息,例如xr.open_dataset(filestrF[0,1,1,1]).dis.encoding

+0

非常感謝 - 這是現貨。我在文檔中錯過了這一點,我不得不說,它非常出色。 – dreab

2

假設time是記錄維度,請嘗試使用NCO's ncrcat快速連接應保留壓縮的三個文件。

ncrcat file1.nc file2.nc file3.nc -O concat.nc