_FillValue または missing_value はまだストレージ領域を占有していますか?
いくつかの null 値を持つ 2-dimission 配列がある場合、ストレージ スペースを節約するために netcdf ファイルに書き込むにはどうすればよいですか?
_FillValue または missing_value はまだストレージ領域を占有していますか?
いくつかの null 値を持つ 2-dimission 配列がある場合、ストレージ スペースを節約するために netcdf ファイルに書き込むにはどうすればよいですか?
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 変数の効率的な圧縮」を参照してください。
または同様にNCOで
ncks -7 -L 9 in.nc out.nc
Funkensieper からの優れた回答に加えて、cdo を使用してコマンド ラインからファイルをコピーおよび圧縮できます。
cdo -f nc4c -z zip_9 copy in.nc out.nc
gzip や zip などを使用して単純にファイルを圧縮することもできますが、欠点は、読み取る前に解凍する必要があることです。netcdf4 圧縮機能を使用すると、これを回避できます。
-z zip_X を使用して、レベル X の圧縮を選択できます。ファイルが非常に大きい場合は、アクセス時間を短縮する代わりに、ファイル サイズを少し犠牲にすることをお勧めします (たとえば、9 ではなく zip_5 または 6 を使用します)。多くの場合、異種データの場合、圧縮されていないファイルに比べて圧縮率は小さくなります。