【问题标题】:Sharing variables when parallel processing并行处理时共享变量
【发布时间】:2019-08-04 03:07:27
【问题描述】:

我设置了一个进程,并行处理 8 个程序以提取大量数据。但是,我必须维护每个变量中的所有变量(这是每月一次)。

有没有办法创建一个包含所有变量的主程序并在运行时跨程序共享它们?我知道每个程序都使用自己的 SAS 实例,所以我认为没有。

【问题讨论】:

  • 程序可以共享一个库。
  • hmmm...所以我可以创建一个永久库 (MYLIB) 并分配一堆 %let 变量(MONTH 等)。我如何在我的其他程序中调用它们? &MYLIB.MONTH?
  • 描述 8 个程序中每个程序中的变量,以及您想要的最终结果。 %LET 变量是宏变量,可以更多地被认为是控制流、代码生成和数据过滤值的参数。你想让 8 个程序中的每一个使用相同的宏变量值吗?
  • 我在一家数据公司工作,我正在提取数百万条记录。我必须按产品类型将拉动分成 8 个不同的程序,所以我确实需要所有 8 个程序使用相同的 %Let MONTH 变量。我很想这样做一次,但如果我不能这样做,这比破坏交易更烦人。
  • 将参数值(如 MONTH)存储在共享库中的数据集中。如果这对代码有帮助,则每个分支都可以将参数数据集中的值转换为宏变量。

标签: sas


【解决方案1】:

如您所见,不同的 SAS 程序不会自动共享变量,但您可以显式传递它们:

  • 通过环境变量传递它们(当您的参数很少时,这尤其有用,例如报告日期)。

    • 在这种情况下,启动程序可以是一个简单的 shell 脚本,例如在 *nix 中:

      export REPORT_DATE=20190701
      sas -sysin program_a.sas
      
    • 或者,从 SAS,您可以使用 systask command 执行子 SAS 会话
    • 您可以从子会话中通过%sysget 检索参数值:

      %let REPORT_DATE = %sysget(REPORT_DATE);
      
  • 按照 cmets 的建议,通过将参数存储在共享位置(例如数据集中)。

    • 在父会话中:

      data sharedlib.params;
          REPORT_DATE = "&REPORT_DATE";
      run;
      
    • 在子会话中:

      proc sql noprint;
          select REPORT_DATE /*format XXX. as necessary*/ into :REPORT_DATE
          from sharedlib.params;
      quit;
      
  • 如果您使用 SAS/CONNECT 管理子会话(即 signonrsubmit),您可以通过 %sysrput 传递变量

【讨论】:

    猜你喜欢
    • 2019-12-11
    • 2020-06-12
    • 1970-01-01
    • 2017-06-18
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    相关资源
    最近更新 更多