CF規約に従いながら可能なデータ量圧縮
格子型の数値データのデータ量を減らすには、次の方法が考えられる。
- ビットパタンによる圧縮。情報をビット列と見て冗長性が小さくなるように変換する。情報を失わない。zipやgzipソフトウェアの圧縮機能はこれ。
- 数値が欠損した格子点を別扱いにすることによってその部分のデータ量を節約する。情報を失わない。
- スケーリングによる圧縮。 数値情報のうち実際に保存したい有効ビット数を考え、x(i) = a + b * y(i)のような式で変換して、浮動小数点の配列xの代わりに、必要なビット数の整数の配列yと、浮動小数点のスカラー値 aとbを記録する。情報の一部が失われるが科学的に有意な情報を確保する。GRIB (WMOの規格)では通常に使われている。
データが実数値の空間分布する場を浮動小数点値で表現したものである場合、 1の方法ではあまり大きな圧縮ができない。空間的に隣りあう実数値の値が近くても、その浮動小数点値のビットパタンは似ていないからである。ただしデータがまとまって欠損している部分がありそこに同じflag値がはいっていれば、その部分は効率よく圧縮される。
CF規約1.4版には、「8. Reduction of Data Size」の下に次の2つがある。
- 8.1. Packed data
- 8.2. Compression by gathering
Packed data (8.1)
これはスケーリングによる圧縮で、aをadd_offset、bをscale_factorと呼んでいる。NetCDFの都合で配列yは8, 16, 32ビットのいずれかの符号つき整数となる(8ビットの場合には符号なしとみなすことが可能。 CF規約2.2節参照)。 GRIBのように任意のビット数の整数を使うことはできない。ただし実質ビット数が名目よりも少ないならば、ビットパタンによる圧縮を併用すれば、データ量は実質ビット数以内におさまるだろう。
Compression by gathering (8.2)
これは有効な数値がある格子点だけの値を記録する方法である。有効な格子点の番号の表を別の変数として記録する。CMIP5の使い方では、有効な格子点の表が時間とともに変わらないことが前提となる。
CMIP5の場合
- CMIP5で扱う標準フォーマットは、この点ではCMIP3と同様に、格子点値を4バイト浮動小数点で持つことに決めてしまったので、スケーリング(packed data)は使えない。
- NetCDFのversion 4が持つHDF5のビットパタンによる圧縮機能が使えるが、浮動小数点データに対する圧縮効率はデータ欠損部分を除いて高くない。
- 海だけあるいは陸だけなど一定の格子点にだけ値がある場合は、compression by gatheringを利用することは可能。
今後に向けての意見
GO-ESSP会議では議論の時間に増田がこの件を指摘した。CMIP5のフォーマットはもう変えられないが、データ量圧縮の意義は理解されたと思う。 CMIP5のフォーマットの変形として16ビットまたは8ビット整数へのスケーリングを含むフォーマットのデータ例を作り、GO-ESSPコミュニティに示したいと増田は考えている。
Wikiページ作成 2009-10-14, 最新更新 2009-10-16
HTMLページ作成 2015-10-14
増田 耕一 (MASUDA Kooiti)
[2009年GO-ESSP会議報告の本文へ]
[個人Wikiにあった文書の一覧へ]
[増田のホームページへ]