2009-07-02 10 views
3

私は、並列コンピューティングツールボックスを使用して複数のコンピュータに分散した実験を行っています。私は、実験の進捗状況(または発生したエラー)のログを生成し、プロセスが実行されている間にこの情報をファイルに保存したいと考えています。それを行うための標準的な方法は何ですか?パラレルMATLABとロギング

EDIT:

  1. 私はすべての労働者(私はすべてのマシンからアクセス可能なネットワークドライブを持っている)

私のためだけで一つのファイルにしたい

  • あきれるほど並列を使用主な関心事は、複数の従業員が追加するためにファイルを開いていることです。メッセージを失う危険性がありますか、ファイルを開く際にエラーが発生しますか?

  • +0

    あなたは平行あきれるほどやっていますか?各作業者に1つのファイルを、またはクライアントマシンに1つのファイルを1つずつ入れたいですか?どのくらいの頻度でこのファイルを更新しますか?タスクごとに1つだけ更新しますか? – MatlabDoug

    答えて

    4

    複数のプロセスが1つのファイルに出力する場合、にメッセージが上書きまたは混在するなどの潜在的な問題が発生する可能性があります。私はこれを他の言語のプログラム(Cのようなもの)で実行しましたが、と同じ問題がMATLABでも発生する可能性がありますが、私はこれについて間違っていると私は自信を持っています。 ...私はない間違っている

    を想定すると、プロセスが動作している間、あなたは、単一のログファイルに複数のワーカープロセスからに確実にデータを出力したい場合は、これを行うための一つの方法は、一つのプロセスが担当することにすることですすべてのファイル操作(つまり、「マスター」プロセス)。 「マスター」プロセスは、他のワーカー(すなわち「スレーブ」)からメッセージを収集し、このデータをログファイルに出力する。

    具体的に各プロセスに何があるのか​​わからないので、具体的なコード変更を提案するのは難しいです。ここでは、MATLABでこれを行う方法のいくつかのステップとサンプルコードを示します。これらのコードサンプルを使用すると、各プロセスで同じ機能(process_fcn)を実行していると仮定します。

    • 「マスター」プロセスは、最初のファイルを開くことがあります。 (labindex機能を使用して)このコードは、process_fcnの最初に実行する必要があります。

      if (labindex == 1), 
          fid = fopen('log.txt','at'); %# Open text file for appending 
      end 
      
    • 各プロセスが実行されている間、あなたは変数にログファイルに出力する必要があるすべてのデータを収集することができますデータと呼ばれ、文字列または文字配列を格納します。このデータは、try-catch blockの中でキャプチャされたエラーメッセージ、またはログファイルに入れたい他のデータです。 process_fcnの周期的なポイントで

    • は(どちらかの主要なタスクが完了したか、計算のループ内にあるとき)、あなたは出力をする必要があるデータのための各プロセスのチェックを持っている必要があります(つまり、データは空ではありません)、そのデータを「マスター」プロセスに送信します。「マスター」プロセスは、これらのメッセージを他のプロセスから収集して印刷します。ここでは、これが行われるかもしれない方法のサンプル(機能labBarrierを使用しては、labProbelabSend、およびlabReceive)です:

      labBarrier; %# All processes are synchronized here 
      if (labindex == 1), %# This is done by the "master" 
          if ~isempty(data), 
          fprintf(fid,'%s\n',data); %# Print "master" data 
          end 
          pause(1); %# Wait a moment for "slaves" to send messages 
          while labProbe, %# Loop while messages are available 
          data = labReceive; %# Get data from "slaves" 
          fprintf(fid,'%s\n',data); 
          end 
      else %# This is done by the "slaves" 
          if ~isempty(data), 
          labSend(data,1); %# Send data to the "master" 
          end 
      end 
      data = ''; %# Clear data 
      

      PAUSEへの呼び出しは、それぞれ「スレーブ」のlabSendへの呼び出しことを確実にするためにありプロセスは、「マスター」が送信されたメッセージの検索を開始する前に発生します。

    • 最後に、「master」プロセスはファイルを閉じる必要があります。このコードは、process_fcnの最後に実行する必要があります。

      if (labindex == 1), 
          fclose(fid); 
      end 
      
    +0

    labBarrier関数についてはわかりません(私の仕事は同じ実行時間を持たないためです)。しかし、これは私に良い出発点を与える。 – Eolmar

    +0

    ジョブの実行時間が大きく異なる場合は、データを出力するためにそれらを同期させるのが難しくなります。 labSendがブロッキング*コール(プロセスが一致する受信を待つ)または*ノンブロッキング*コール(メッセージがバッファされ、プロセスが受信を送信したかどうかにかかわらず)であるかどうかはわかりません。上記のコードでは、ブロックされていると想定しています。非ブロックの場合は、おそらくlabBarrierやPAUSEは必要ありません。 – gnovice

    2

    あなたは恥ずかしそうに並列(つまり、仕事と仕事の構造)で、各タスクの終わりにログファイルを更新したいと仮定して、taskFinishコールバックを使用します。

    通常どおりMATLABのようにファイルの途中で何らかの形でファイルに書き込むこともできますが、タスクの最後にコールバックを要求していると思います。