2016-05-19 11 views
4

したがって、パッケージxarrayを使用して連結したい3つのnetcdf4ファイル(それぞれ約90 MB)があります。各ファイルには、365日間(時間)0.5度分解能(緯度、経度)で表される1つの変数(dis)があります。私の目的は、1095日(3年)の時系列を持つように3つのファイルを連結することです。 (年2007年、2008年、2009年)Python xarray.concat次にxarray.to_netcdfが新しいファイルサイズを大きく生成する

各ファイルはあります 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 ... 

などを、私はそれらをインポートして使用し得ます連結するための連結モジュール、私は正常に思える。この場合、モジュールは、新しいデータセットの

flist1 = [1,2,3] 
ds_new = xr.concat([xr.open_dataset(filestrF[0,1,1,f]) for f in flist1],dim='time') 

新しい細部が今であることが示されfilestrF

から3つのNetCDFファイルのファイル名を読み出し:

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

は、私には罰金です。しかし、このデータセットをnetcdfに書き戻すと、ファイルサイズは今や爆発的になり、1年間のデータは一見700 MBに相当します。

2つの連結ファイル、〜1.5ギガバイト 3については
  • については
    ds_new.to_netcdf('saved_on_disk1.nc') 
    
    • ,, ,, 4については2.2ギガバイト
    • ,, ,, 2.9ギガバイト

    私は3を期待しているだろうx 90 MB = 270 MB - 1次元(時間)でスケーリング(3倍)しているためです。変数、dis、および他の次元latおよびlonは、サイズが一定のままです。

    巨大な高級感はありますか?私は連結のないファイルの読み込みと書き戻しをテストし、サイズを増やすことなく成功させました。

  • 答えて

    5

    NetCDFファイルは、おそらくnetCDF4のチャンクワイズ圧縮機能を使用して圧縮されています。

    1つのデータセットを読み込んでディスクに書き戻すと、xarrayはそのデータを同じ圧縮設定で書き戻します。しかし、複数のファイルを結合すると、圧縮設定がリセットされます。この理由の1つは、異なるファイルが異なる方法でディスクに圧縮される可能性があるため、結合された結果をどのように処理すべきかが分かりません。おそらく、手動でものためのあなたの予想されるアクセスパターンに基づいてchunksizes引数を指定したいと思うでしょう

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

    はxarrayドキュメントで encoding引数、 as describedを使用し、圧縮して新しいnetCDFファイルを保存するにはデータ。

    これらのファイルが元々どのように圧縮されていたのかが不明な場合は、の属性(xr.open_dataset(filestrF[0,1,1,1]).dis.encoding)から情報を引き出すことができます。

    +0

    ありがとうございます。これは大変ありがとうございます。私は言わざるを得ないドキュメンテーションの中で、すばらしいことを見逃していました。 – dreab

    2

    timeがレコード次元であると仮定すると、圧縮を維持する必要がある3つのファイルをすぐに連結するためにNCO's ncrcatを使用してみます。

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

    関連する問題