記録バッファとディスク I/O を効率的に使用する

読み取りまたは書き出しが行われる記録は,ユーザーのプログラム・バッファと,Compaq Fortran 実行システムによってファイルが開かれるときに設定される 1 つまたは複数のディスク・ブロック I/O バッファの間で転送されます。読み取りまたは書き出される記録がきわめて大きい場合を除き,ディスクとの読み書きの際には,ディスク・ブロック I/O バッファに複数の論理記録が入ることができ,物理ディスク I/O の回数が最小限に抑えられます。

ディスク・ブロック I/O バッファの大きさは,OPENBLOCKSIZE 指定子を使って指定することができます。OPEN 文で BLOCKSIZE 指定子を省略すると,ファイルが置かれている装置形式で最適な I/O が行われる大きさに設定されます。

BUFFERCOUNT の基本値は 1 です。1 回のディスク I/O で読み取られるデータの量を増やして I/O 性能を向上させる実験を行うときには,BLOCKSIZE 値ではなく BUFFERCOUNT 値を増やしてください。

OPEN 文に BUFFERCOUNT および BLOCKSIZE 指定子が含まれている場合,これらの値の積が,内部バッファの大きさ (バイト単位) となります。これらの指定子が指定されていないときの基本の大きさは,/fpscomp:general (または /fpscomp:all) が指定されていた場合には 1024 バイト,省略されていた場合には 8192 バイトです。この内部バッファは,最も大きな記録を収容できるように拡張されますが,縮小されることはありません。

ディスク書き出しに対して,OPEN 文に BUFFERED 指定子を指定するか,/assume:buffered_io オプションを指定するか,FORT_BUFFERED 環境変数を指定することによって,記録が書き出しのたびにディスクに書き出されるのか (フラッシュ,基本設定),バッファに蓄積されるのかを制御することができます。

FORT_BUFFERED 環境変数を TRUE に設定しない限り,基本設定はすべての I/O について BUFFERED='NO'/assume:nobuffered_io で,Fortran 実行システムは個々の WRITE 文 (またはこれと同じような記録出力文) ごとに内部バッファを空にします。

BUFFERED='YES' を指定するか,/assume:buffered_io を指定するか,FORT_BUFFERED 環境変数を TRUE に設定する場合,ディスク装置に対して,ディスクに書き出される前に,複数の記録出力文 (WRITE) からの出力が内部バッファに詰込まれます。

OPEN 文の BUFFERED 指定子は,/assume:[no]buffered_io オプションに優先されます。両方が設定されていない (基本設定) 場合,FORT_BUFFERED 環境変数が実行時に検証されます。

OPEN 文の BUFFERED 指定子は,特定の論理装置に適用されます。これとは対照的に,/assume:[no]buffered_io オプションと FORT_BUFFERED 環境変数はすべての Fortran 装置に適用されます。

バッファリングされた書き出しを使用すると,ディスクに書き出されるデータのブロックが大きくなり,書き出しの回数が減るために,一般にディスク I/O の効率が改善されます。しかし,バッファリングされた書き出しを使用中に,システム障害が起こると,その時点でディスクに書き出されていなかった記録が失われます (これらの記録は,基本設定のバッファリングを使わない書き出しでは,ディスクに書き出されていたはずです)。