2014-04-17 154 views
1

我以前很少使用proc freq。我试图运行以下内容,并收到错误,表示SAS无法分配足够的内存。该数据集有大约15,000条记录。我在这里有什么选择?SAS - proc freq ...内存不足?

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

你有多少个独特的BSN和DSB值? – Joe

回答

0

既然你百分之下降,下面应该是相同的:

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

的BY语句应显著减少内存分配。你也可以用类似的方式使用PROC SQL,这可能适合内存。

问题很可能是DSB和BSN每个都是独特的值,所以你可能每个都有10k +的值 - 制作一个10k * 10k或1e8单元的主表,需要8e8字节的内存,这可能是超出了SAS的可用内存。

+0

在看到你的建议之前,我实际上可以通过在它之前添加一个数据步骤来将我的原始freq工作,以将记录缩小到几百个。我只是测试了你的建议,它完美的工作。谢谢您的帮助! – user2941280

0

我以前也碰到过这个。我得到的方式是根本不使用proc freq。我相信我用proc summary代替。它也可以计数频率。

首先测试数据集:

data tmp; 
    set sashelp.class; 
    dummy = 1; 
run; 

使用原来的freq方法:

proc freq data=tmp noprint; 
    table sex*age/out=freq1(where=(count>1) drop=percent); 
run; 

使用proc summary方法:

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标志。