Up|<<Prev|Next>>


5.10 開かれたNEtCDFファイルをディスクを同期させる: nc_sync

関数 nc_sync はメモリ内バッファとNetCDFファイルのディスク上コピーとを同期させる方法を提供します。 書き込み後に、同期させたい理由としては2つ挙げられます。

この関数はNetCDFライブラリ以前のバージョンと後方互換性があります。その目的は、一つのNetCDFファイルを複数の読者と一人の作成者の間で共有可能にすることにあります。作成者は書き込み後に nc_sync を呼び出し、読者は読み取る前に毎回 nc_sync を呼び出します。作成者側では、この操作によってバッファされているものが全てディスク上に移動します。読者側では、この操作によって次に読み取られる記録が以前にキャッシュされたバッファからではなく、ディスクからの読み取りであることが保証されます。これによって、読者はファイルを閉じて新たに開くことなく、書込み操作によって加えられた変更を見ることが出来ます(例えば書き込まれた記録数)。わずかなデータ量をアクセスする場合には、書き込み後に一々ディスクと同期させることは、バッファすることの有用性を手放すことになり、コンピュータ資源のコストを上げてしまいます。

共有を簡単にするために(そして推奨される方法は)、作成者、読者共にファイルを NC_SHARE フラグを立てて開くことです。そうすれば nc_sync を呼び出す必要は 全くなくなります。しかし、 異なる処理間において少数のNetCDFアクセスのみを同期させる場合には、 nc_sync 関数はNC_SHARE フラグよりも より細かい粒度を持ちます。

従属的なデータ(属性値など)に加えられた変更にも注意する必要があります。これらは NC_SHARE フラグによっては自動的に伝達されません。このためには nc_sync 関数を使わなければなりません。

作成者がデータの設計を変えるために定義モードに入った時にファイルを共有する場合は特に注意しなくてはなりません。以前のバージョンでは、作成者が定義モードを抜けると、変更は新ファイルに加えられたために、読者は旧ファイルを参照したままでした。読者が変更を見る為にはファイルを一度閉じて開きなおさなければなりませんでした。 それによって、変更されたファイルが手元にあっても、読者側の内部テーブルが新しいファイルの設計と一致していないことには読者には伝わりません。再定義後にもNetCDFファイルが共有されるためには、再定義中に読者がデータにアクセスするのを防ぎ、次にアクセスする前に読者に nc_sync を呼び出させる 、何らかのNetCDFライブラリ外のメカニズムが必要になります。

nc_sync を呼び出すとき、NetCDFファイルは データモードになくてはなりません。定義モードのNetCDFファイルは nc_enddef が呼び出されたときにのみディスクと同期します。他の処理によって書き込まれているNetCDFファイルを読み取る処理は nc_sync を呼び出すことによって 、ファイルを閉じてサイド開くことなく、書き込み処理によって変えられた最新の変更(例えば、書かれた記録数)に関する情報を得られます。

NetCDFファイルを閉じた時、又は定義モードから抜けるたびに、データは 自動的にディスクと同期します。

 

int nc_sync(int ncid);

 

ncid

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

 

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

 

この 例では nc_sync を使って、 foo.nc というNetCDFファイルのディスク書き込みを同期させます。

#include <netcdf.h>
   ... 
int status;
int ncid;
   ... 
status = nc_open("foo.nc", NC_WRITE, &ncid);  /* 書き込み用に開く */
if (status != NC_NOERR) handle_error(status);
 
   ...           /* データを書き込む、又は属性を変更する */
 
status = nc_sync(ncid);      /* ディスクに同期させる */
if (status != NC_NOERR) handle_error(status);

Up|<<Prev|Next>>