1

_FillValue または missing_value はまだストレージ領域を占有していますか?

いくつかの null 値を持つ 2-dimission 配列がある場合、ストレージ スペースを節約するために netcdf ファイルに書き込むにはどうすればよいですか?

4

3 に答える 3

3

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 ドキュメントのセクション 9)「netCDF 変数の効率的な圧縮」を参照してください。

于 2017-05-22T08:12:39.967 に答える
2

または同様にNCOで

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

于 2017-05-30T04:48:05.143 に答える
2

Funkensieper からの優れた回答に加えて、cdo を使用してコマンド ラインからファイルをコピーおよび圧縮できます。

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

gzip や zip などを使用して単純にファイルを圧縮することもできますが、欠点は、読み取る前に解凍する必要があることです。netcdf4 圧縮機能を使用すると、これを回避できます。

-z zip_X を使用して、レベル X の圧縮を選択できます。ファイルが非常に大きい場合は、アクセス時間を短縮する代わりに、ファイル サイズを少し犠牲にすることをお勧めします (たとえば、9 ではなく zip_5 または 6 を使用します)。多くの場合、異種データの場合、圧縮されていないファイルに比べて圧縮率は小さくなります。

于 2017-05-22T11:30:56.850 に答える