【问题标题】:SAS batch jobs: executing multiple scripts through the same local server connectionSAS批处理作业:通过同一个本地服务器连接执行多个脚本
【发布时间】:2016-02-26 17:30:38
【问题描述】:

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

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

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

【问题讨论】:

    标签: batch-file sas


    【解决方案1】:

    你好 access_granted,

    你在正确的轨道上。您在对 RawFocus 的 cmets 中说,“它像套接字服务器一样运行”,在您的问题中说“保持 TCP 连接保持活跃”。您实际上可以通过一些巧妙的编程在 SAS 中进行归档。

    SAS Socket 服务器: 这是一个宏语言的 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 TCP 服务器从客户端读取代码并在到达时执行它。将我的响应窗口缩短到几秒钟。只需要围绕它进行一些创造性的编码。
    • @access_granted 很高兴您喜欢这个答案。如果您对它感到满意,请接受它:-)
    【解决方案2】:

    如果您对它们在同一个 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";
    

    等等

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

    【讨论】:

    • 当您在执行时准备好这些脚本时,这将起作用。但是我正在调查当您有 1 个 sas 文件时的情况,然后在 15 分钟内出现另一个文件 - 比如说 - 。因此,由于本地 SAS 运行 - 看起来像一个套接字服务器 - 我想知道是否有办法针对先前打开的连接执行第二个 sas 文件。类似于 - 如果您打开 SAS GUI 客户端,执行第一个代码,然后将新的 sas 代码粘贴到其中进行第二次执行。
    • 我想我明白你在做什么(在现有的本地基础 sas 会话中运行一个新的 .sas 程序)但是如果你可以更新你的问题以显示你是如何调用你的程序会有所帮助目前
    • 我想到了 Vassili 写的一些东西,只是不确定 sas 中是否存在服务器/客户端接口。使用他的代码示例,我现在几乎可以运行各种 tcp 客户端,并将 sas 代码发送到父计算机,因此,它省略了为每个下一个脚本启动 sas 环境的必要性,因为服务器无限运行循环。
    • 好东西 - 在这种情况下你应该接受他的回答:-)