SAS内存不足错误

时间:2016-12-29 21:02:29

标签: sas out-of-memory sas-dis

我在SAS DIS(数据集成工作室)中收到“远程进程内存不足”: enter image description here

由于我的方法可能是错误的,我将解释我正在处理的问题以及我已经决定的解决方案:

我有一大堆需要清理的客户名称。为了实现这一点,我使用包含正则表达式模式及其相应替换的.csv文件; (我使用这种方法,因为更容易将新模式添加到文件并将其上载到服务器以便部署作业进行读取而不是编码新规则并重新部署作业。)

为了使我的数据步骤能够利用文件中的规则,我在数据步骤的第一次迭代中将模式及其替换添加到数组中,然后将它们应用于我的名字。类似的东西:

DATA &_OUPUT;

    ARRAY rule_nums{1:&NOBS} _temporary_;
    IF(_n_ = 1) THEN
        DO i=1 to &NOBS;
            SET WORK.CLEANING_RULES;
            rule_nums{i} = PRXPARSE(CATS('s/',rule_string_match,'/',rule_string_replace,'/i'));
        END;
    SET WORK.CUST_NAMES;
    customer_name_clean = customer_name;
    DO i=1 to &NOBS;
        customer_name_clean = PRXCHANGE(a_rule_nums{i},1,customer_name_clean);
    END;
RUN;

当我在大约10K行或更少的行上运行时,它总是完成并且非常快地完成。如果我尝试~15K行,它会扼杀超长时间并最终抛出“Out of memory”错误。

为了尝试解决这个问题,我构建了一个循环(使用SAS DIS循环转换),其中我首先对我的数据集的行进行编号,然后一次以10000个名称的批量应用前面的逻辑。很长一段时间后,我得到了同样的内存不足错误,但是当我检查我的目标表(Teradata)时,我注意到它运行并加载了除最后一次迭代之外的所有数据。当我将循环大小从10000切换到1000时,我看到了完全相同的行为。

出于测试目的,我一直只使用大约约500K的行,但很快将需要处理数百万,并且担心这将如何发挥作用。作为参考,我正在应用的一组清洁规则目前是20行,但可能会增长到几百行。

  • 使用带有规则的文件而不是直接在我的datastep中对正则表达式进行硬编码是否效率明显降低?
  • 有没有办法实现这个而不必循环?
  • 由于我的数据集在每次循环迭代时都被覆盖,对于1000行长(和3列)的数据集,怎么会出现内存不足错误?
  • 最终,如何解决内存不足错误?

谢谢!

1 个答案:

答案 0 :(得分:0)

问题原来是作业生成的日志太大了。可能的解决方案是禁用日志记录或将日志重定向到可以定期清除和/或有足够空间的位置。