使用xarray对NetCDF数据应用函数后,文件大小显著增加(x10)



我正在做NetCDF格式的ERA5再分析数据,需要根据U和V分量计算风向

我已经有了一个工作的Python代码,使用xarray和pandas,并将输出保存为NetCDF。

虽然我没有添加任何额外的数据(只是应用转换来计算一个新的变量,而不是U和V),但我得到了输出文件大小的巨大增加。输入文件约30mo,输出文件约300mo。

谁能解释一下这是怎么回事?我的输出文件的格式肯定有问题,但我不知道是怎么回事。是由于文件的编码,使用的数据类型(此处输入和输出均为float32),还是任何其他NetCDF格式问题?

还有,你知道我怎样才能优化输出文件的大小吗?

为了帮助您理解差异,这里是输入文件的摘要:

<xarray.Dataset>
Dimensions:     (latitude: 7, longitude: 8, time: 113952)
Coordinates:
number      int64 ...
* time        (time) datetime64[ns] 1979-01-01 ... 1991-12-31T23:00:00
step        timedelta64[ns] ...
surface     float64 ...
* latitude    (latitude) float64 47.5 47.25 47.0 46.75 46.5 46.25 46.0
* longitude   (longitude) float64 -3.0 -2.75 -2.5 -2.25 -2.0 -1.75 -1.5 -1.25
valid_time  (time) datetime64[ns] ...
Data variables:
u10         (time, latitude, longitude) float32 ...
Attributes:
GRIB_edition:            1
GRIB_centre:             ecmf
GRIB_centreDescription:  European Centre for Medium-Range Weather Forecasts
GRIB_subCentre:          0
Conventions:             CF-1.7
institution:             European Centre for Medium-Range Weather Forecasts
history:                 2022-05-04T13:10 GRIB to CDM+CF via cfgrib-0.9.9...

和输出的

<xarray.Dataset>
Dimensions:     (latitude: 7, longitude: 8, time: 113952)
Coordinates:
* time        (time) datetime64[ns] 1979-01-01 ... 1991-12-31T23:00:00
* latitude    (latitude) float64 46.0 46.25 46.5 46.75 47.0 47.25 47.5
* longitude   (longitude) float64 -3.0 -2.75 -2.5 -2.25 -2.0 -1.75 -1.5 -1.25
Data variables:
number      (time, latitude, longitude) int64 0 0 0 0 0 0 0 ... 0 0 0 0 0 0
step        (time, latitude, longitude) timedelta64[ns] 00:00:00 ... 00:0...
surface     (time, latitude, longitude) float64 0.0 0.0 0.0 ... 0.0 0.0 0.0
valid_time  (time, latitude, longitude) datetime64[ns] 1979-01-01 ... 199...
direction   (time, latitude, longitude) float32 17.76 26.89 ... 180.1 178.5

我能看到的唯一区别是一些原始坐标现在是数据变量。

最重要的是,所有变量现在都由(time, latitude, longitude)索引,因此将具有(7 x 8 x 113952)的完整数组大小。以前,number,stepsurface是标量(不是数组-只是一个值),valid_time只被time索引。由于所有这些都是64位的,因此您的新数组现在有效地拥有4个新变量,每个变量的大小是u10的两倍。因此,仅这一点就占了9倍的增长。

为了确保不会发生这种情况,请尝试非常小心地只执行数学&重塑操作的数据数组,而不是数据集。Xarray在处理数据集时工作得非常好,但是当您刚刚掌握它的诀窍时,它的行为并不总是直观的,像这样的自动广播是可能让您措手不及的事情之一。出于这个原因,我总是建议人们使用dataarray完成工作,然后在编写之前创建一个Dataset。有关此主题的更多信息,请参阅文档"按维度名称广播"one_answers"自动对齐"。

我还希望,如果您从ECMWF获得这些数据,源数据可能会被压缩到磁盘上,这不是ds.to_netcdf的默认值。有关压缩选项的讨论,请参阅编写netCDFs的文档。

最新更新