2017-03-12 44 views
0

単純な解決策があるかもしれませんが、現在は私の周りに頭を浮かべることはできません。多分誰かが私を助けてくれるかもしれません。SAS並列処理:N個のジョブが完了するまで、k個の並列ジョブを開始します。

だから私は、次のような問題があります。

私は終了したい総N SASの仕事を持っています。私のマシン上のリソースがあまりにも限られているため、同時にNのジョブを開始することはできません。私は同時にk = 5と言うことを始めたいと思います。 1つのジョブが終了するたびに、次のジョブを開始したい。ジョブが完了する順序は重要ではありません。素敵なアイデア

/*The following macro starts k threads*/ 
%macro parallel_processing(k); 

options fullstimer autosignon=yes sascmd="sas -nonews -threads"; 

%global thread jj idlist; 

/*These are the N ID numbers for the jobs*/ 
%let idlist = 1 2 3 4 5 ... N; 
%let jj = 0; 
%do %until(&jj.=N); 
    %do thread = 1 %to &k.; 
     %let jj = %eval(&thread.+&jj.); 
     %syslput thread = &thread; 
     %syslput jj = &jj.; 
     %syslput idlist = &idlist.; 

     rsubmit process=task&thread. wait=no sysrputsync=yes; 

      %let id =%scan(%trim(&idlist.),&jj.); 
      /*Do the job*/ 
      %job(id); 

     endrsubmit; 
    %end; 

    /* HERE IS MY PROBLEM: 
     I want to wait for each job separately, and start a new one 
     with an increased id. So that constantly k threads are busy. 
    */ 

    /* Wait for all threads to finish */ 
    waitfor _all_ %do thread = 1 %to &k.; 
     task&thread 
    %end; 

    /* GET RESULTS FROM THREADS */ 
    %do thread = 1 %to (&k.); 
     rget task&thread; 
    %end; 

    /* SIGNOFF THREADS*/ 
    %do thread = 1 %to (&k.); 
     signoff task&thread; 
    %end; 
%end; 
%mend parallel_processing; 

%parallel_processing(k); 

たぶん誰かが持っている、私は希望:

現在、私はので、ここで次の5 は、擬似コードで開始する前に、すべてのk=5仕事は、私が現在やっている何のために終了してみましょう感謝する!前もって感謝します。

答えて

2

利用waitfor _any_ ...代わりのwaitfor _all_ ...

    5つのタスクがアクティブであるかのノートを保ち、最初の5つのタスクを起動
  1. これらのいずれかが終了するまで待って、アクティブなタスクのリストから削除します。
  2. キューから次のタスクを開始し、アクティブなタスクのリストに追加します。
  3. タスクがキューに残らなくなるまで、手順2と3を繰り返します。

どの5つのタスクが現在アクティブであるかを把握する方法を使用できます。

+0

ありがとうございました。問題は、どの5つのタスクが実行されているかを追跡する方法です。 'LISTTASK'は結果をログファイルに出力します。現在実行中のタスクのリストにアクセスするにはどうしたらいいですか? –

+1

RSUBMITステートメントでCMACVAR =オプションで定義したマクロ変数を使用してステータスを確認してください。 – Tom

+0

あなたのヒントをありがとう!素晴らしい作品:D –

関連する問題