6

私には2人の独立したMatlabワーカーがいて、最初にデータを取得/保存し、2番目にデータを読み取ります(そしていくつかの計算などを行います)。

FIRSTはデータを.matファイルとしてハードディスクに保存し、SECONDはそこからデータを読み取ります。SAVE.matおよび8millisecとして、このデータに約20秒かかりますDELETE。データを保存する前に、まず古いファイルを削除してから、新しいバージョンを保存します。

SECONDはどのようにしてデータが存在することを確認できis not corruptますか?使用できますexistsが、データが破損しているかどうかはわかりません。たとえば、FIRSTがデータを保存しているときにSECONDがデータを正確に読み取ろうとすると、exists合格しLOADますが、「データが破損している」などのエラーが表示されます。

ありがとう。

4

2 に答える 2

7

何らかの同期メカニズムがなければ、それはできません。SECOND がチェックを完了してファイルの読み取りを開始するまでに、FIRST が再び書き込みを開始している可能性があります。ある種のロックまたはミューテックスが必要です。

ベース Matlab の 2 つのオプション。

これがローカル ファイル システム上にある場合は、データ ファイルの隣にある別のロック ファイルを使用して、データ ファイルへの同時アクセスを管理できます。Matlab 内から Java の NIO FileChannel および FileLock オブジェクトを使用してロック ファイルの最初のバイトをロックし、それをセマフォとして使用してデータ ファイルへのアクセスを制御します。したがって、リーダーはライターが終了するまで待機し、その逆も同様です。(これがネットワークファイルシステム上にある場合は、これを試さないでください - ファイルロックは機能しているように見えるかもしれませんが、通常は公式にサポートされておらず、私の経験では信頼できません。)

または、呼び出しの前後に try/catch を配置してload()、数秒間一時停止し、破損したファイル エラーが発生した場合に再試行することもできます。.mat ファイル形式は、ライターがまだ書き込みを行っている場合、部分的な読み取りが行われないようなものです。その破損したファイルエラーが発生します。したがって、これを怠惰な衝突検出とバックオフとして使用できます。これは私が通常行うことです。

競合のウィンドウを減らすには、最初に同じディレクトリ内の一時ファイルに書き込み、名前変更を使用してそれを最終的な宛先に移動することを検討してください。そうすれば、ファイルは、20 秒間のデータ書き込みではなく、ファイルシステムの迅速な移動操作中にのみ使用できなくなります。ライターが複数ある場合は、競合を避けるために一時ファイル名に PID とホスト名を含めます。

于 2012-01-12T18:14:42.870 に答える
1

2 つのスレッド (RW) 間の古典的なリソース共有の問題のように思えます。

つまり、労働者間の安全なコミュニケーションの方法を見つける必要があります。これをチェックしてください。

また、入力してみてください

showdemo('paralleldemo_communic_prof')

マトラブで

于 2012-01-12T17:25:54.170 に答える