単一の.sasスクリプトを実行する場合、「ローカルサーバーへの接続の確立」とライブラリのロードに約30秒を浪費し、その後、sasスクリプト自体を3秒間実行します。
同じ確立された接続に対して複数のsasスクリプトをプログラムで実行することは可能ですか(Windowsシェルを介してそれらを呼び出します)?
キープアライブ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サーバーに1つのリクエストを送信できます。また、クライアントは、結果を送り返すポートをサーバーに指示する責任があることにも注意してください(必要な場合)。
%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秒は少し長くなります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加