【问题标题】:How to write null values in netcdf file?如何在 netcdf 文件中写入空值?
【发布时间】:2017-10-21 05:21:04
【问题描述】:

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

如果有一个包含一些空值的二维数组,我如何将其写入 netcdf 文件以节省存储空间?

【问题讨论】:

    标签: netcdf nco cdo-climate


    【解决方案1】:

    在 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 变量的高效压缩”。

    【讨论】:

      【解决方案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)。在许多异构数据的情况下,压缩增益相对于未压缩文件来说很小。

      【讨论】:

        【解决方案3】:

        或与NCO类似

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-09
          • 2015-06-26
          • 2012-10-03
          • 2022-01-09
          • 2021-11-05
          • 2015-04-09
          相关资源
          最近更新 更多