5.10 オープンされたNetCDFファイルをディスクに同期させる: nc_sync
関数nc_sync はメモリ内バッファとNetCDFファイルのディスク上コピーとを同期させる方法を提供します。書き込み後に同期させたい理由としては2つ挙げられます。
・ 異常終了の場合のデータ損失を最低限に抑える。
・ 書き込まれた直後から他の処理においてデータをアクセス可能にする。しかしながら、既にファイルを開いている処理に関しては、書き込み処理がnc_syncを呼び出すときに記録数が増加していることはわからないことに注意してください。その処理が記録数の増加を知るためには、読み取り処理が nc_syncを呼び出さなくてはならない。
この関数は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 の値を返します。それ以外の場合には、返されたステータスがエラーを示します。エラーの原因として下記が挙げられます。
・ NetCDFファイルが定義モードにある。
・ 指定されたNetCDF ID がオープンされたNetCDFファイルを参照していない。
例
この例では 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);
Quadralay Corporation http://www.webworks.com Voice: (512) 719-3399 Fax: (512) 719-3606 sales@webworks.com |