SAS 批处理作业:通过同一本地服务器连接执行多个脚本



执行单个 .sas 脚本时,我浪费了大约 30 秒的时间来"建立与本地服务器的连接"和库加载,然后执行 3 秒的 sas 脚本本身。

是否可以针对同一已建立的连接以编程方式执行多个 sas 脚本(我通过 Windows shell 调用它们)?

像一个保持活动状态的TCP通道?

你好access_granted,

你走在正确的轨道上。您在对RawFocus的评论中说,"它像套接字服务器一样运行",并在您的问题中说"保持TCP连接"。实际上,您可以通过一些巧妙的编程将其归档到SAS中。

SAS 套接字服务器:这是一个宏语言的SAS服务器,永远循环到响应请求。在等待时值得注意的是下一个请求,服务器处于休眠状态,消耗非常其主机上的资源很少。

/* Port as input parameter */
%let portno= &sysparm;
%* let portno= 001;
%do %while ( 1 );
filename in_msg SOCKET " :&portno"
SERVER;
filename temp_pgm  "%sysfunc(pathname(work))/a-ready.sas" ;
data _null_;
infile in_msg;
 file temp_pgm;
 input ;
 put _infile_;
run;
filename in_msg;
/* Before execution, server can choose to
parse it first */
%inc temp_pgm;
run;
filename temp_pgm;
%end;

此客户端提供 SAS 服务器的 IP 地址、要调用的端口号以及服务器要执行的程序文件。它能够向已知的可用 SAS 服务器发送一个请求。另请注意,客户端负责指示服务器在哪个端口上发回结果(如果需要)。

%let host= IP-address-for-server-machine;
%let portno= 001;
filename to_servr SOCKET “ &host:&portno” ;
filename input ‘SAS-program-to-be-run-onserver.sas’;
/* Simple scheme to come up with a different port
number to accept response from the server */
%let ret_port= %eval( &portno + 1 );
data _null_;
 file to_servr;
infile input end= EOF;
if _n_ = 1 then do;
/* Required info for the server to return results
back to this client */
 put ‘%let ret_port= ’ “ &ret_port;” ;
 put ‘%let client= IP-address-for-clientmachine;’;
end;
input ;
 put _infile_;
run;
filename input;
filename to_servr;
/* Receiving socket for the results */
filename back_rst SOCKET “ :&ret_port” SERVER;
data null_;
infile back_rst;
 file print;
 input ;
 put _infile_;
run;
filename back_rst;

来源: http://www2.sas.com/proceedings/sugi24/Coders/p083-24.pdf

顺便说一下,如果可能,您还可以考虑重新配置 SAS 服务器。 启动会话的 30 秒有点长,尤其是对于批处理会话。

如果你很高兴它们在同一个 sas 会话中连续运行,你可以创建一个 sas 脚本来执行其他脚本。

options source2; /* puts the contents of the sas files below in the log */
%inc "C:MyLocscript1.sas";
%inc "C:MyLocscript2.sas";
%inc "C:MyLocscript3.sas";

等。

这种方法的缺点是,您的程序必须适当地处理先前运行中任何剩余的工作表/宏/宏变量等(它们不会有干净的会话)。

最新更新