开始使用 MP Connect 进行 SAS 并行处理
Getting started with SAS parallel processing using MP Connect
我想了解 MPConnect 以及如何使用它进行并行处理。
作为一个简单的例子,我启动了一个永远打印 "Hello World!" 的会话和另一个打印 "Bye World!" 的会话。我说 "waitfor any" 和 "rget" 并且我希望日志中出现 "Bye World!",因为 "Hello World!" 将永远持续下去,而 "Bye 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;
问题似乎是,当您有同步进程时 运行ning 它们彼此完全断开连接。即使您只是在等待快速 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
需要每个(完成的)进程的最终日志文件才能将它们合并到客户端会话日志 window。
查看 SAS 文档的详细信息部分 here:
编辑:
再试一试,您可以使用统一的库名测试它们之间的连接(每个进程都有自己独特的工作库名,因此它们不会相互冲突):
根据需要在客户端计算机上分配库名和选项:
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
仍然是 运行ning,但它将能够访问 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 TASK1,在这种情况下它将在那里暂停。
我想了解 MPConnect 以及如何使用它进行并行处理。
作为一个简单的例子,我启动了一个永远打印 "Hello World!" 的会话和另一个打印 "Bye World!" 的会话。我说 "waitfor any" 和 "rget" 并且我希望日志中出现 "Bye World!",因为 "Hello World!" 将永远持续下去,而 "Bye 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;
问题似乎是,当您有同步进程时 运行ning 它们彼此完全断开连接。即使您只是在等待快速 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
需要每个(完成的)进程的最终日志文件才能将它们合并到客户端会话日志 window。
查看 SAS 文档的详细信息部分 here:
编辑:
再试一试,您可以使用统一的库名测试它们之间的连接(每个进程都有自己独特的工作库名,因此它们不会相互冲突):
根据需要在客户端计算机上分配库名和选项:
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
仍然是 运行ning,但它将能够访问 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 TASK1,在这种情况下它将在那里暂停。