Memory SAS-程序频率…内存不足?

Memory SAS-程序频率…内存不足?,memory,sas,Memory,Sas,我以前很少使用proc freq。我正在尝试运行以下程序,但收到一个错误消息,表示SAS无法分配足够的内存。该数据集大约有15000条记录。我的选择是什么 proc freq data=dsb_un noprint; table bsn*dsb / out=dsb_un2(where=(count>1) drop=percent); run; 由于您正在降低百分比,以下内容应该是相同的: proc freq data=dsb_un noprint; by bsn; tables ds

我以前很少使用proc freq。我正在尝试运行以下程序,但收到一个错误消息,表示SAS无法分配足够的内存。该数据集大约有15000条记录。我的选择是什么

proc freq data=dsb_un noprint; 
table bsn*dsb / out=dsb_un2(where=(count>1) drop=percent); 
run;

由于您正在降低百分比,以下内容应该是相同的:

proc freq data=dsb_un noprint;
by bsn;
tables dsb/out=dsb_un2(where=(count>1) drop=percent);
run;
BY语句应该会显著减少内存分配。您还可以以类似的方式使用procsql,这可能很适合内存


问题很可能是DSB和BSN都是唯一的值,因此每个值可能都有10k+的值-创建一个包含10k*10k或1e8单元的主表,需要8e8字节的内存,这可能超出了SAS的可用内存。

我以前也碰到过这个问题。我解决这个问题的方法就是不使用proc freq。我相信我使用了proc summary。它也可以计算频率

首先是测试数据集:

data tmp;
  set sashelp.class;
  dummy = 1;
run;
使用原始频率方法:

proc freq data=tmp noprint; 
  table sex*age / out=freq1(where=(count>1) drop=percent); 
run;
proc summary data=tmp noprint nway missing;
  class sex age;
  var dummy;
  output out=freq2(where=(dummy>1) drop=_type_ _freq_) sum=;
run;
使用过程摘要方法:

proc freq data=tmp noprint; 
  table sex*age / out=freq1(where=(count>1) drop=percent); 
run;
proc summary data=tmp noprint nway missing;
  class sex age;
  var dummy;
  output out=freq2(where=(dummy>1) drop=_type_ _freq_) sum=;
run;

请注意,proc summary可能需要一个虚拟变量,您可以根据它进行计算。因此,在我的测试数据集中创建了dummy=1标志。

您有多少唯一的BSN和DSB值?在看到您的建议之前,我实际上能够通过在原始proc freq之前添加一个数据步骤使其工作,从而将记录缩小到仅几百条。我刚刚也测试了你的建议,效果非常好。谢谢你的帮助!