如何在netcdf文件中写入空值?

时间:2017-05-21 14:04:49

标签: netcdf

_FillValue或missing_value是否仍占用存储空间?

如果有一个带有一些空值的2-dimission数组,如何将其写入netcdf文件以节省存储空间?

3 个答案:

答案 0 :(得分:2)

在netCDF3中,每个值都需要相同数量的磁盘空间。在netCDF4中,可以使用gzip压缩减少所需的磁盘空间。实际压缩比取决于数据。如果有许多相同的值(例如缺少数据),则可以获得良好的结果。这是python中的一个例子:

import netCDF4
import numpy as np
import os

# Define sample data with all elements masked out
N = 1000
data = np.ma.masked_all((N, N))

# Write data to netCDF file using different data formats
for fmt in ('NETCDF3_CLASSIC', 'NETCDF4'):
    fname = 'test.nc'
    ds = netCDF4.Dataset(fname, format=fmt, mode='w')
    xdim = ds.createDimension(dimname='x', size=N)
    ydim = ds.createDimension(dimname='y', size=N)
    var = ds.createVariable(
        varname='data',
        dimensions=(ydim.name, xdim.name),
        fill_value=-999,
        datatype='f4',
        complevel=9,  # set gzip compression level
        zlib=True  # enable compression
    )
    var[:] = data
    ds.close()

    # Determine file size
    print fmt, os.stat(fname).st_size

参见netCDF4-python documentation,第9节)" netCDF变量的高效压缩"详情。

答案 1 :(得分:2)

只需添加Funkensieper的优秀答案,您就可以使用cdo从命令行复制和压缩文件:

 cdo -f nc4c -z zip_9 copy in.nc out.nc

可以使用gzip或zip等压缩文件,但缺点是需要在阅读前解压缩。使用netcdf4压缩功能可以避免这种情况。

您可以使用-z zip_X选择压缩级别X.如果您的文件非常大,您可能需要牺牲一点文件大小以换取更快的访问时间(例如使用zip_5或6而不是9)。在许多情况下,对于异构数据,压缩增益相对于未压缩文件较小。

答案 2 :(得分:2)

或类似于NCO

ncks -7 -L 9 in.nc out.nc