Up|<<Prev|Next>>


5.12 書き込みのフィルモードを設定する: nc_set_fill

この関数は以下に述べる状況下での書き込みを最適化するための高度な使用を目的としています。関数 nc_set_fill は書き込み用に開かれたNetCDFファイルの フィルモード を設定し、返しの引数として現行のモードを返します。フィルモードは NC_FILL 又は NC_NOFIL のどちらででも設定でき、 NC_FILL に対応したデフォルト状態はデータがフィル値によって既に埋められているというものです。即ち、非記録型変数を生成する際、もしくは未だに書き込まれていないデータを超えた値を記入する際に、フィル値が記入されます。これによって書き込まれる前にデータを読み取ってしまうことを感知できます。フィル値の使用法の 詳細については、 7.16 - フィル値。独自のフィル値の定義の仕方については 8.1 - 属性の慣習

NC_NOFILL に対応する動作は、データをフィル値で満たそうとするデフォルト動作を無効にします。これによって、NetCDFライブラリがフィル値を書き込み、さらにそれらの値が後にデータによって上書きされるという二重の操作を避けることができ、パフォーマンスが向上します。

返り値によってNetCDFファイルがどのモードにあったかということが分かります。この値を利用して、開かれたNetCDFファイルのフィルモードを一時的に変更し、後で元のモードに復旧させることが出来ます。

開かれたNetCDFファイルを NC_NOFILL モードにした後は、後で読み取られる全ての位置に有効なデータが書き込まれていることを確認してください。nofillモードは書き込み用に開かれたNetCDFファイルの一時的な性質でしかない点に注意してください。ファイルを一旦閉じて再度開いたときには、デフォルト動作に戻ります。又、フィルモードを陽に NC_FILL に設定するために、再び nc_set_fill を呼び出すことによってデフォルト動作に戻ることが出来ます。

nofillモードを設定することが有益な場合が3つあります。

  1. NetCDFファイルを生成・初期化するとき。この場合には nc_enddef を呼び出す前にnofillモードを設定しましょう。その後に、非記録型変数と初期化したい記録変数の初期値を 完全に 書き込んで下さい。
  2. 既存の記録指向のNetCDfファイルを拡張する時。書き込み用にファイルを開いた後に、nofillモードを設定し、追加する記録を漏れなく付加する。間に書き込まれていない記録が存在してはいけない。
  3. 既存のNetCDFファイルに初期化する予定の新しい変数を追加するとき。 nc_enddef を呼び出す前にnofillモードを設定し、新しい変数を完全に書き込む。

もし、NetCDFファイルが無制限次元を持ち、最後の記録がnofillモードにおいて書き込まれた場合には、nofillモードが設定されていない場合に比べてファイルが短い可能性がある。 しかし、これはNetCDFインターフェースを通してのみデータアクセスすれば完全に透過性は保たれる。

将来のリリースでは、この機能はなくなっている(又は不必要)であるかもしれない。プログラマーの方はこの機能に必要以上に頼らないことが望ましい。

 

int nc_set_fill (int ncid, int fillmode, int *old_modep];

 

ncid

以前の nc_open 又は nc_create 呼び出しで返されたNetCDF ID。

fillmode

ファイルの取るべきフィルモード。 NC_NOFILL 又は NC_FILL

old_modep

この呼び出し以前の返された現行のフィルモードの位置を示すポインタ。 NC_NOFILL 又は NC_FILL

 

エラーが発生していなければ、 nc_set_fill NC_NOERR の値を返します。それ以外の場合には、返された状態がエラーを示します。エラーの原因として下記が挙げられます。

 

この 例では nc_set_fill を使って、 foo.nc というNetCDFファイルの連続書き込みのnofillモードを設定します。

#include <netcdf.h>
   ... 
int ncid, status, old_fill_mode;
   ... 
status = nc_open("foo.nc", NC_WRITE, &ncid);  /* 書き込み用に開く */
if (status != NC_NOERR) handle_error(status);
 
   ...           /* デフォルトprefill設定でデータを書き込む */
 
status = nc_set_fill(ncid, NC_NOFILL, &old_fill_mode); /* nofill設定 */
if (status != NC_NOERR) handle_error(status);
 
   ...           /* prefill無しでデータを書き込む */

Up|<<Prev|Next>>