Python xarray.concat然后xarray.to_netcdf生成巨大的新文件大小

dre*_*eab 4 python concatenation python-xarray

所以我有3个netcdf4文件(每个约90 MB),我想使用包xarray连接.每个文件有一个变量(dis),以0.5度分辨率(lat,lon)表示365天(时间).我的目标是连接三个文件,使得我们的时间序列为1095天(3年).

每个文件(2007年,2008年,2009年)都有:1个变量:dis 3坐标:time,lat,lon ......就这样

<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 ...
Run Code Online (Sandbox Code Playgroud)

我得到它们导入并使用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')
Run Code Online (Sandbox Code Playgroud)

现在显示新数据集的新细节:

Dimensions:  (lat: 360, lon: 720, time: 1095)
Run Code Online (Sandbox Code Playgroud)

对我来说似乎很好.但是,当我将此数据集写回netcdf时,文件大小现已爆炸,1年的数据似乎相当于700 MB.

ds_new.to_netcdf('saved_on_disk1.nc')
Run Code Online (Sandbox Code Playgroud)
  • 对于2个连接文件,大约1.5 GB
  • 对于3 ,,, 2.2 GB
  • 对于4 ,,, 2.9 GB

我原本期望3 x 90 MB = 270 MB - 因为我们在一个维度(时间)缩放(3x).lat和lon的变量,dis和其他尺寸在尺寸上保持不变.

任何想法请大小的巨大高档?我已经测试了读取和写回文件而没有连接,并且成功完成此操作而不增加大小.

sho*_*yer 5

您开始使用的netCDF文件是压缩的,可能使用netCDF4的块式压缩功能.

当您读取单个数据集并将其写回磁盘时,xarray会使用相同的压缩设置将该数据写回.但是,当您组合多个文件时,将重置压缩设置.部分原因是不同的文件可能以不同的方式压缩在磁盘上,因此如何处理组合结果并不明显.

要使用压缩保存新的netCDF文件,请使用encoding参数,如 xarray文档中所述:

ds_new.to_netcdf('saved_on_disk1.nc', encoding={'dis': {'zlib': True}})
Run Code Online (Sandbox Code Playgroud)

您可能还希望chunksizes根据数据的预期访问模式手动指定参数.

如果您对这些文件最初是如何压缩感到好奇,可以从encoding属性中提取该信息,例如xr.open_dataset(filestrF[0,1,1,1]).dis.encoding.