Python xarray.concat 然后 xarray.to_netcdf 生成巨大的新文件大小
Python xarray.concat then xarray.to_netcdf generates huge new file size
所以我有 3 个 netcdf4 文件(每个大约 90 MB),我想使用包 xarray 将它们连接起来。每个文件都有一个变量 (dis),以 0.5 度分辨率(纬度、经度)表示 365 天(时间)。我的目标是连接这三个文件,这样我们就有了 1095 天(3 年)的时间序列。
每个文件(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 的大小保持不变。
请问您对超大尺寸有什么想法吗?我已经测试了在没有串联的情况下读入和写回文件,并且在没有增加大小的情况下成功地做到了这一点。
您开始使用的 netCDF 文件已压缩,可能使用 netCDF4 的块压缩功能。
当您读取单个数据集并将其写回磁盘时,xarray 会使用相同的压缩设置将该数据写回。但是当您合并多个文件时,压缩设置会被重置。部分原因是不同的文件可能以不同的方式在磁盘上压缩,因此应该如何处理组合结果并不明显。
要压缩保存新的 netCDF 文件,请使用 encoding
参数,xarray 文档中的 as described:
ds_new.to_netcdf('saved_on_disk1.nc', encoding={'dis': {'zlib': True}})
您可能还希望根据您预期的数据访问模式手动指定 chunksizes
参数。
如果您好奇这些文件最初是如何压缩的,您可以从 encoding
属性中提取该信息,例如 xr.open_dataset(filestrF[0,1,1,1]).dis.encoding
.
假设 time
是记录维度,尝试使用 NCO's ncrcat 快速连接应该保留压缩的三个文件。
ncrcat file1.nc file2.nc file3.nc -O concat.nc
所以我有 3 个 netcdf4 文件(每个大约 90 MB),我想使用包 xarray 将它们连接起来。每个文件都有一个变量 (dis),以 0.5 度分辨率(纬度、经度)表示 365 天(时间)。我的目标是连接这三个文件,这样我们就有了 1095 天(3 年)的时间序列。
每个文件(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 的大小保持不变。
请问您对超大尺寸有什么想法吗?我已经测试了在没有串联的情况下读入和写回文件,并且在没有增加大小的情况下成功地做到了这一点。
您开始使用的 netCDF 文件已压缩,可能使用 netCDF4 的块压缩功能。
当您读取单个数据集并将其写回磁盘时,xarray 会使用相同的压缩设置将该数据写回。但是当您合并多个文件时,压缩设置会被重置。部分原因是不同的文件可能以不同的方式在磁盘上压缩,因此应该如何处理组合结果并不明显。
要压缩保存新的 netCDF 文件,请使用 encoding
参数,xarray 文档中的 as described:
ds_new.to_netcdf('saved_on_disk1.nc', encoding={'dis': {'zlib': True}})
您可能还希望根据您预期的数据访问模式手动指定 chunksizes
参数。
如果您好奇这些文件最初是如何压缩的,您可以从 encoding
属性中提取该信息,例如 xr.open_dataset(filestrF[0,1,1,1]).dis.encoding
.
假设 time
是记录维度,尝试使用 NCO's ncrcat 快速连接应该保留压缩的三个文件。
ncrcat file1.nc file2.nc file3.nc -O concat.nc