5.12 書き込みのフィルモードを設定する: nc_set_fill
この関数は以下に述べる状況下での書き込みを最適化するための高度な利用を目的としています。関数nc_set_fill は書き込み用にオープンされたNetCDFファイルのフィルモード(fill mode)を設定し、戻り値として現行のモードを返します。フィルモードは NC_FILL または NC_NOFIL のどちらででも設定でき、NC_FILL に対応したデフォルトステータスはデータがフィル値によって既に埋められているというものです。即ち、非記録型変数を生成する際、もしくは未だに書き込まれていないデータを超えた値を記入する際に、フィル値が記入されます。これによって書き込まれる前にデータを読み取ってしまうことを感知できます。フィル値の使用法の詳細については、7.16節 「フィル値」(p.82)を参照して下さい。独自のフィル値の定義の仕方については 8.1節 「属性の規約」(p.84)を参照して下さい。
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 の値を返します。それ以外の場合には、返されたステータスがエラーを示します。エラーの原因として下記が挙げられます。
・ 指定されたNetCDF IDがオープンされたNetCDFファイルを参照していない。
・ 指定されたNetCDF IDが読み取り専用にオープンされたファイルを参照している。
・ フィルモード引数が NC_NOFILL または NC_FILLのどちらでもない。
例
この例では 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無しでデータを書き込む */
Quadralay Corporation http://www.webworks.com Voice: (512) 719-3399 Fax: (512) 719-3606 sales@webworks.com |