Sas 错误:内存不足

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

当运行一个输入为~5M obs的程序时,我遇到内存不足错误。和153个变量

在~40000 obs上运行相同程序时。-程序执行并完成了伟大的任务。 当我尝试增加输入OB的数量时。超过100K-我得到一个错误:内存不足

我尝试遵循以下提示并取消选中几个框:

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)是:

  • 将数据集拆分为较小的数据集
  • 对每个较小的数据集进行排序
  • 通过使用简单的数据步骤将所有内容重新组合在一起。(将所有较小的数据集放在set语句中,并使用排序的by语句)
  • 此列表方法(和标记排序)的说明如下:


    请注意,所有这些方法都要求您消除任何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 ;