使用MP Connect

时间:2015-06-01 06:49:02

标签: sas

我正在尝试了解MPConnect以及如何将其用于并行处理。

作为一个简单的例子,我开始了一个打印“Hello World!”的会话。永远和另一个打印“再见世界!”。我说“等待任何”和“rget”,我期待“再见世界!”在日志中因为“Hello World!”将在“再见世界”中永远继续下去!已完成。不幸的是,这不起作用。

通常,从远程提交的任务中检索输出时遇到很大困难。

option cpucount=4 sascmd="!sascmd" autosignon;

rsubmit task1 wait=no;

    data _null_;
        do while(1);
        put "Hello World!";
        end;

    run;

endrsubmit;


rsubmit task2 wait=no;

    data _null_;
        put "Bye World!";
    run;

endrsubmit;


waitfor _any_;
rget;

signoff task1;
signoff task2;

2 个答案:

答案 0 :(得分:1)

问题似乎是当你有同步进程运行时,它们彼此完全断开连接。即使你只是等待快速task2完成才能继续:

rsubmit task2 wait=no;
    data _null_;
        put "Bye World!";
    run;
endrsubmit;

SAS需要task1才能完成最后的rget

rsubmit task1 wait=no;
    data _null_;
        do while(1);
        put "Hello World!";
        end;
    run;
endrsubmit;

我认为发生的事情是SAS task2满足waitfor _any_条件并且能够在task2之后继续进行处理。但是,rget需要每个(已完成)进程的最终日志文件,然后才能将它们合并到客户端会话日志窗口中。

请查看SAS文档here的详细信息部分:

修改

多玩一点,您可以使用统一的libname测试它们之间的连接(每个进程都有自己唯一的工作libname,因此它们不会相互冲突):

在客户端计算机上根据需要分配libname和options:

libname testlib 'C:/test' ;
option cpucount=4 sascmd="!sascmd" autosignon;

定义两个并行运行的进程:

* Process 1 ;
rsubmit task1 wait=no;
libname testlib 'C:/test' ;
data testlib.test1 ;
  do i=1 to 1000 ;
    do j=1 to 1000;
      output ;
    end ;
  end ;
run ;
endrsubmit;

* Process 2 ;
rsubmit task2 wait=no;
libname testlib 'C:/test' ;
data testlib.test2 ;
  do i=1 to 1000 ;
    output ;
  end ;
run ;
endrsubmit;

然后,您可以拥有以下代码,该代码将在process1仍在运行时运行,但它将能够访问process2的输出数据集:

* Wait for either of the above processes and the process remaining code;
waitfor _any_;

proc sql noprint ;
  select sum(i)
  into :result
  from testlib.test2 
;quit ;

%put *** SUM OF TEST2 IS: &result *** ;

答案 1 :(得分:1)

问题是,就像你说的那样,TASK1将永远运行。具体来说就是声明

signoff task1;

这导致了您的特定问题。正如您所说的提交过程中等待无限期过程结束,然后签字......

如果你有了

signoff task2;
killtask task1;

您会看到您确实使用RGET从TASK2收集日志信息(SIGNOFF语句也将在没有RGET的情况下收集)。在这种情况下,来自TASK1的信息会丢失,但是已经提到了选项(LOG =" task1.log"),您可以单独恢复信息。

在这种情况下,RGET语句不会等待所有内容完成。除非您特别请求RGET TASK1,否则它将从请求时已完成的任何任务中收集它可以获得的内容,在这种情况下它会暂停。