执行单个.sas脚本时,我在“建立与本地服务器的连接”和库加载上浪费了大约30秒,然后执行sas脚本本身的3秒钟。
是否可以通过编程方式执行多个sas脚本(我通过Windows shell调用它们)来对抗同一个已建立的连接?
像保持活动的TCP频道一样?
答案 0 :(得分:1)
Hello 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秒有点长,特别是对于批处理会话。
答案 1 :(得分:0)
如果您对他们在相同的sas 会话中连续运行感到高兴,您可以创建一个sas脚本来执行其他脚本..
options source2; /* puts the contents of the sas files below in the log */
%inc "C:\MyLoc\script1.sas";
%inc "C:\MyLoc\script2.sas";
%inc "C:\MyLoc\script3.sas";
等
这种方法的缺点是你的程序必须适当处理以前运行的任何剩余的工作表/宏/宏变量等(它们不会有干净的会话)。