Sas 错误:内存不足
当运行一个输入为~5M obs的程序时,我遇到内存不足错误。和153个变量 在~40000 obs上运行相同程序时。-程序执行并完成了伟大的任务。 当我尝试增加输入OB的数量时。超过100K-我得到一个错误:内存不足 我尝试遵循以下提示并取消选中几个框:Sas 错误:内存不足,sas,enterprise-guide,Sas,Enterprise Guide,当运行一个输入为~5M obs的程序时,我遇到内存不足错误。和153个变量 在~40000 obs上运行相同程序时。-程序执行并完成了伟大的任务。 当我尝试增加输入OB的数量时。超过100K-我得到一个错误:内存不足 我尝试遵循以下提示并取消选中几个框: 1.Tools ► Options ► Results General ► deselect all Result Formats. 2.Tools ► Options ► Results General ► deselect Open gen
1.Tools ► Options ► Results General ► deselect all Result Formats.
2.Tools ► Options ► Results General ► deselect Open generated data/results automatically.
3.Tools ► Options ► Results General ► deselect Link handcoded ODS results.
4.Tools ► Options ► SAS Programs ► deselect Automatically direct results back to SAS Enterprise Guide.
仍然没有工作
我使用企业指南5.1
但最终会将工作代码插入到Data Integration Studio 4.6上用户编写的代码转换中
有人知道如何让这个程序工作吗
已编辑
这段代码导致错误消息:
data _null_;
set all_include_Stornos ;
IF TREATMENT_IND = 1 AND DDS_ROW_IND NE 1 THEN DO;
CALL EXECUTE ('%STORNO_TKUFA ('||POLICY_RK||');');
CALL EXECUTE ('%UPDATE (STORNO_TKUFA_CUMULATE);');
END;
IF TREATMENT_IND in (4) AND DDS_ROW_IND NE 1 THEN DO;
CALL EXECUTE ('%HAKPAA ('||POLICY_RK||','||POLICY_VERSION||');');
call execute ('%UPDATE(HAKPAA_CUMULATE);');
END;
IF TREATMENT_IND = 5 AND DDS_ROW_IND NE 1 and count_bitul_no <2 or (count_bitul_no >1 and max_bitul_ver = policy_verSion ) THEN DO;
CALL EXECUTE ('%BITUL ('||POLICY_RK||','||POLICY_VERSION||');');
CALL EXECUTE ('%UPDATE(BITUL_CUMULATE);');
END;
IF TREATMENT_IND = 6 AND DDS_ROW_IND NE 1 THEN DO;
CALL EXECUTE ('%LAST_STATE ('||POLICY_RK||','||POLICY_VERSION||');');
CALL EXECUTE ('%UPDATE (LAST_STATE_calc);');
END;
IF DDS_ROW_IND NE 1 and ((PREV_TREATMENT_IND = 4 AND TREATMENT_IND NOT IN (1,2,5)) or treatment_ind = 3) THEN DO;
CALL EXECUTE ('%HAFSHARA ('||POLICY_RK||','||POLICY_VERSION||');');
CALL EXECUTE ('%UPDATE (HAFSHARA_CUMULATE);');
END;
IF TREATMENT_IND = 2 AND POLICY_VERSION - 1 = max_bitul_ver AND DDS_ROW_IND NE 1 THEN DO;
CALL EXECUTE ('%STORNO_BITUL ('||POLICY_RK||','||POLICY_VERSION||');');
CALL EXECUTE ('%UPDATE (STORNO_BITUL_CUMULATE);');
END;
RUN;
根据编辑和您的评论,我怀疑“order by”和/或“proc sort”部分无法处理正在运行的系统上的卷。
50米是很多记录,但大多数人仍然可以管理。 但是,如果您的数据增长到5亿条记录,可能会太多。
我记得不久前我有一个客户端,其中数据集是1.2亿行和(iirc)+-300个变量,我们确实遇到了类似的问题。
幸运的是,有一些方法可以在排序中处理大量数据。
1。使用标记排序选项
您可以将tagsort作为选项添加到proc sort语句中。在这种情况下,SAS只使用by语句中的列进行排序,然后附加记录的其余部分。它的资源密集度较低,但速度当然较慢。
2。对by语句使用索引
如果以后在proc/data步骤中需要按by语句的特定顺序排列数据,则可以在这些变量上创建索引,而不是对数据进行排序。我的经验是,这将允许SAS处理更大的数据集。当然,它速度较慢,占用更多的空间(对于索引而言),您需要考虑索引的存在(和破坏)。
3。分割数据集,对部分进行排序,然后将所有内容缝合在一起
最后一种方法(在许多情况下可能优于选项2)是:
请注意,所有这些方法都要求您消除任何order by,并使用适当的排序过程跟踪这些proc sql片段。基于此:“我知道它抛出的是哪个数据步骤。问题是,数据null根据if语句调用不同的宏。” 看看
callexecute
是如何工作的。(会有帮助)
本质上,callexecute
将立即解析宏代码,但它会将生成的SAS步骤排队,直到当前数据步骤完成。换句话说,您可能正在内存中构建数以百万计的SAS代码行,SAS只是存储这些代码,以便在数据为空时执行代码>步骤完成。最终,它变得如此之大,以至于SAS公司就这样一败涂地
如何应对?只需编写一个宏来中断
数据\u null\u代码>分块。您可以使用proc sql
在宏变量中选择all\u include\u Stornos
中的记录数。然后使用宏循环多次运行数据步骤,每次使用firstobs
和obs
仅命中部分数据。这样,您就可以将由callexecute
建立的缓冲区保持在合理的大小。这样可以防止内存不足。首先,您需要检查分配给sas会话和排序的磁盘空间。这些选项称为MEMSIZE和SORTSIZE
运行此代码,您将看到日志中的值(以字节为单位):
proc options group=memory option=(memsize sortsize) ; run;
我建议将此行添加为代码中的第一行,以便为排序大小分配最大空间:options sortsize=MAX
并查看这是否解决了问题
否则,您可以将MEMSIZE更改为MAX,请按照以下步骤操作 将%nrstr()
添加到调用执行语句中
CALL EXECUTE ('%nrstr(%STORNO_TKUFA) ('||POLICY_RK||');');
CALL EXECUTE ('%nrstr(%UPDATE) (STORNO_TKUFA_CUMULATE);');
或者最好更改您的数据_null uu步骤,以生成一个包含代码和%的文件
filename code temp;
data _null_;
set all_include_Stornos ;
IF TREATMENT_IND = 1 AND DDS_ROW_IND NE 1 THEN DO;
put '%STORNO_TKUFA (' POLICY_RK ');';
put '%UPDATE (STORNO_TKUFA_CUMULATE);';
...
RUN;
%include code ;
我不是EG方面的专家,但你有没有尝试过采用其他方法呢。收到一条错误消息。。。SAS找不到路径或类似的东西好吧,如果它真的很长,你最好把它分成小块运行。这样,您就可以确定哪里出了问题。大多数内存问题可以通过采取稍微不同的方法来解决,在某些情况下甚至可以通过添加一个关键字来解决。但当然,您需要指出它失败的地方。根据我的经验,通常的怀疑往往是大型散列合并,或者对跨越数百万级的类语句使用proc means/summary,但这可能是完全不同的。您设置了什么memsize和sortsize选项,以及您的机器有多少内存?我知道它会将我抛出哪个数据步。问题是,它是一个数据null,根据if语句调用不同的宏。当我以80K的观测值输入运行代码时,我处理的表大约是50M。当我以~400K观测值的输入运行相同的过程时,我看到表的权重~500M。我没有因为工作空间低效或其他原因而犯任何错误。刚从服务器抛出,内存不足错误。我编辑了我的帖子并插入了我所说的空数据。希望现在它会对你更有意义。无论如何,谢谢。PROC SORT
不会耗尽内存,只要选项SORTSIZE
未设置为高于可用内存量;它将只使用磁盘。谢谢你们的回复。我试图打断宏
filename code temp;
data _null_;
set all_include_Stornos ;
IF TREATMENT_IND = 1 AND DDS_ROW_IND NE 1 THEN DO;
put '%STORNO_TKUFA (' POLICY_RK ');';
put '%UPDATE (STORNO_TKUFA_CUMULATE);';
...
RUN;
%include code ;