SAS调用宏时内存不足

时间:2019-02-11 19:49:44

标签: sas

当我需要多次调用宏时,我一直在DATA NULL 步骤中使用CALL EXECUTE,如下所示:

DATA _NULL_;
  DO i=1 to 1000;
  CALL EXECUTE ('%mymacro');
  RUN;

到目前为止,这对我来说还是不错的。但是,如果我使用这种方法调用%mymacro一百万次(例如),在运行一次宏之前,我会收到“内存不足”错误。

我对此的天真理解是SAS试图在执行之前将宏写出一百万次,因此在此过程中内存不足。这个准确吗?并且:有什么好的方法可以解决这个问题?

2 个答案:

答案 0 :(得分:0)

您只需要了解Call Execute的工作原理:

基本上,Call Execute会立即解析宏代码,但是会将最终的SAS步骤排队,直到当前数据步骤完成为止。换句话说,您可能会在data _null_步骤完成后在SAS刚刚存储的内存中建立数百万行的SAS代码。最终,它变得太大,以至于SAS崩溃。

以下是几种解决方案:

  

1-将%nrstr()添加到您的CALL EXECUTE语句中。

     

2-或更改您的data _null_步骤以生成包含代码和%include的文件。

答案 1 :(得分:0)

一个选择是改变数据步骤,以便它实际上创建一个包含宏调用的.sas文件,然后%include。例如:

data _null_;
  file "myfile.sas";
  do i=1 to 1000;
    put '%mymacro';
  end;
run;

%include "myfile.sas";

可能解决了该问题。再说一次,我不确定SAS是否需要包含100万行代码的.sas程序。如果是后者,则只需将该程序分解为10个.sas文件,每个文件包含10万行代码。