SAS并行处理:随后启动k个并行作业,直到完成N个作业

时间:2017-03-12 19:54:18

标签: parallel-processing sas

可能有一个简单的解决方案,但目前我无法理解它。也许有人可以帮助我。

所以我有以下问题:

我要完成N个SAS工作。由于我的计算机上的资源太有限,无法同时启动所有N个作业,我只想同时开始说k = 5。每当一份工作完成,我想开始下一份工作。完成工作的顺序并不重要。

目前,我在开始下一个5之前完成所有k=5个工作。 所以这是伪代码,我正在做的事情:

/*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);

也许有人有个好主意,我将不胜感激!提前谢谢。

1 个答案:

答案 0 :(得分:2)

使用waitfor _any_ ...代替waitfor _all_ ...

  1. 开始前5个任务,记下哪5个任务处于活动状态。
  2. 等待其中任何一个完成并将其从活动任务列表中删除。
  3. 从队列中启动下一个任务,并将其添加到活动任务列表中。
  4. 重复步骤2和3,直到队列中没有剩余任务。
  5. 您可以使用任何您喜欢的方法来跟踪当前有效的5个任务。