何らかの同期メカニズムがなければ、それはできません。SECOND がチェックを完了してファイルの読み取りを開始するまでに、FIRST が再び書き込みを開始している可能性があります。ある種のロックまたはミューテックスが必要です。
ベース Matlab の 2 つのオプション。
これがローカル ファイル システム上にある場合は、データ ファイルの隣にある別のロック ファイルを使用して、データ ファイルへの同時アクセスを管理できます。Matlab 内から Java の NIO FileChannel および FileLock オブジェクトを使用してロック ファイルの最初のバイトをロックし、それをセマフォとして使用してデータ ファイルへのアクセスを制御します。したがって、リーダーはライターが終了するまで待機し、その逆も同様です。(これがネットワークファイルシステム上にある場合は、これを試さないでください - ファイルロックは機能しているように見えるかもしれませんが、通常は公式にサポートされておらず、私の経験では信頼できません。)
または、呼び出しの前後に try/catch を配置してload()
、数秒間一時停止し、破損したファイル エラーが発生した場合に再試行することもできます。.mat ファイル形式は、ライターがまだ書き込みを行っている場合、部分的な読み取りが行われないようなものです。その破損したファイルエラーが発生します。したがって、これを怠惰な衝突検出とバックオフとして使用できます。これは私が通常行うことです。
競合のウィンドウを減らすには、最初に同じディレクトリ内の一時ファイルに書き込み、名前変更を使用してそれを最終的な宛先に移動することを検討してください。そうすれば、ファイルは、20 秒間のデータ書き込みではなく、ファイルシステムの迅速な移動操作中にのみ使用できなくなります。ライターが複数ある場合は、競合を避けるために一時ファイル名に PID とホスト名を含めます。