执行单个 .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";
等。
这种方法的缺点是,您的程序必须适当地处理先前运行中任何剩余的工作表/宏/宏变量等(它们不会有干净的会话)。