0

私は複雑なコードに取り組んでおり、いくつかの変更を加えました。このコードの主な目的は、2 つのファイルを開き、各ファイルから一度に 1 レコードずつデータを取得して計算を実行することです。これらのファイルは非常に大きく、フォーマットされていません。

私の最初の変更は、セグメント化されたファイルタイプ フラグを使用してこれらのファイルを保存し、コードでそれらをセグメント化されたものとして読み込むようにすることでした。これはうまくいきます。

私の次の変更は、REWIND を BACKSPACE に変換することでした。私のコードは次のようになります。

if (kneed .le. kbeg) then
        kback=kbeg-kneed                                                
        if(kback.le.5)then
           do i=1,kback
               backspace ivec
           end do
        else
           rewind ivec
           do 10 i=1,kneed+6
              read(ivec)
           10 continue
        end if
end if

ここで何が起きているか: IVEC はファイルのハンドルです。FILE1 は、1、2、3、4、....N のように順番に読み取られます。次に、FILE1 の N ごとに FILE2 が 2 回読み込まれ、FILE1 のレコード N と FILE2 の両方のレコード N-1 と N+1 の間で計算が実行されます。つまり、計算 (FILE1_N、FILE2_N-1) と計算 (FILE1_N、FILE2_N+1) です。

コードでは、kbeg は FILE2 の現在のレコード、kneed は目的のレコードです。

ここで REWIND が必要でした。FILE2 は、後続の N+1 (FILE1) 計算のために N-1 に到達するために巻き戻す必要がありました。私の問題は、この REWIND が最大のボトルネックであることが判明したことでした。この IF ステートメントを実装して BACKSPACE を実行することで高速化しようとしています (変更前は、ELSE セクションのステートメントのみが存在し、「+6」が存在します)。私のファイルには、レコードの開始前に 6 行のヘッダーがあるためです)。

問題: この変更を行うと、BACKSPACE によってプロセスが高速化されているように見えますが、FILE2 レコードを読み取ると、REWIND 機能を使用したときとはデータが異なります。ここでのロジックは問題ないように見えます。実際に初めて FILE2 に対してこれを行うと機能しますが、その後はデータが間違っているように見えます。

BACKSPACE が適切に機能するために、セグメント化されたレコードについて注意する必要があるかどうか疑問に思っています。また、kneed と kbeg は正しく表示されています。唯一の問題は、データを配列に読み込むと、REWIND 関数のみが存在する場合とはデータが異なることです。

何か不足していますか?

さらに情報を提供する必要がある場合は、私に知らせてください!

4

0 に答える 0