使用MP Connect开始SAS并行处理

使用MP Connect开始SAS并行处理,sas,Sas,我试图了解MPConnect,以及如何将其用于并行处理 作为一个简单的例子,我启动了一个打印“Hello World!”的会话,另一个打印“Bye World!”。我说了“waitforany”和“rget”,我希望在日志中出现“byeworld!”,因为当“byeworld!”结束时,“helloworld!”会一直持续下去。不幸的是,这不起作用 通常,我很难从远程提交的任务中检索输出 option cpucount=4 sascmd="!sascmd" autosignon; rsubmi

我试图了解MPConnect,以及如何将其用于并行处理

作为一个简单的例子,我启动了一个打印“Hello World!”的会话,另一个打印“Bye World!”。我说了“waitforany”和“rget”,我希望在日志中出现“byeworld!”,因为当“byeworld!”结束时,“helloworld!”会一直持续下去。不幸的是,这不起作用

通常,我很难从远程提交的任务中检索输出

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;

问题似乎在于,当同步进程运行时,它们之间完全断开连接。即使您只是在等待fast
任务2
完成后才继续:

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\u any
条件,并且能够在
task2
之后进行处理。但是,
rget
需要每个(完成的)进程的最终日志文件,然后才能将它们合并到客户端会话日志窗口中

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

编辑:

再仔细考虑一下,您可以使用统一的libname测试它们之间的连接(每个进程都有自己唯一的工作libname,这样它们就不会相互冲突):

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

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

问题是,正如您所说,TASK1将永远运行。具体来说,这是一份声明

signoff task1;
这导致了你的特殊问题。正如您对提交过程所说的,等待无限期过程结束,然后注销

如果你有

signoff task2;
killtask task1;
您将看到,您确实使用RGET从TASK2收集日志信息(SIGNOFF语句也会在不使用RGET的情况下收集日志信息)。在本例中,TASK1中的信息将丢失,但使用前面提到的选项(LOG=“TASK1.LOG”),您可以单独恢复信息


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

您在日志输出中实际得到了什么?它将永远持续下去。我认为Bendy是对的。当我尝试创建数据集而不是放入日志时,我可以看到数据集是异步创建的。看来,吉特需要等待。你是对的,我认为吉特需要等待一切。我觉得这有点傻。。。一般来说,我不知道如何让SAS在计算结果时连续输出结果。例如,如果我有3个表格,它们都必须在输出之前完成。是的,这确实很奇怪,但我假设这是并行处理的野兽的本性。尽管如此,请查看此链接,了解如何使用
rsubmit task1 log=“task1.log”output=“task1.lst”
为每个进程指定单独的日志/输出文件: