SAS在调用宏时内存不足

SAS在调用宏时内存不足,sas,Sas,当我需要多次调用一个宏时,我在一个数据为空的步骤中使用了call EXECUTE,如下所示: DATA _NULL_; DO i=1 to 1000; CALL EXECUTE ('%mymacro'); RUN; 到目前为止,这对我很有效。但是,如果使用此方法调用%mymacro一百万次(例如),则在它运行宏一次之前会出现“内存不足”错误 我对这一点的天真理解是,SAS在执行宏之前尝试“写出”宏一百万次,因此在此过程中内存不足。这准确吗?还有:有什么好方法可以解决这个问题?您只需

当我需要多次调用一个宏时,我在一个数据为空的步骤中使用了call EXECUTE,如下所示:

DATA _NULL_;
  DO i=1 to 1000;
  CALL EXECUTE ('%mymacro');
  RUN;
到目前为止,这对我很有效。但是,如果使用此方法调用%mymacro一百万次(例如),则在它运行宏一次之前会出现“内存不足”错误


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

您只需要了解
调用执行
是如何工作的:

基本上,
callexecute
将立即解析宏代码,但它会将生成的SAS步骤排队,直到当前数据步骤完成。换句话说,您可能正在内存中构建数以百万计的SAS代码行,SAS正在存储这些代码,以便在
data\unull\uu
步骤完成时执行。最终,它变得如此之大以至于SAS崩溃了

以下是一些解决方案:

1-将
%nrstr()
添加到调用执行语句中

2-或更改
数据\u null
步骤,以生成带有代码的文件,并
%包含该文件


一个选项是更改数据步骤,以便它实际创建一个包含宏调用的
.sas
文件。。。然后,
%包含它。对于exmaple:

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

%include "myfile.sas";

这可能会解决问题。我也不确定SAS是否想要一个包含一百万行代码的
.SAS
程序。如果是后者,那么只需将程序分成10个
.sas
文件,每个文件有100k行代码。

好的,是的:我想调用EXECUTE“搁置”当前的数据步骤,执行要执行的任何操作,然后返回到原始数据步骤。如果您觉得我的答案有帮助,我希望您接受;)调用%nrstr(%mymacro)如何帮助解决此问题?SAS是否只对字符串“%mymacro”(或其他任何字符串)的实例进行排队?
%NRSTR
函数在编译宏时屏蔽字符串,
调用执行(“%NRSTR(%yourmacro);”)
SAS不会每次写入宏的源代码,而只写入宏的调用。如果将
call execute
切换到
dosubl
,会发生什么情况?
%mymacro
的范围有多广?调用宏1E6次表示设计不完整或伸缩性差。