我在 SAS DIS(数据集成工作室)中收到“远程进程内存不足”:
由于我的方法可能是错误的,我将解释我正在处理的问题以及我决定的解决方案:
我有大量需要清理的客户名称。为了实现这一点,我使用了一个 .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 行,它会阻塞很长时间,并最终引发“内存不足”错误。
为了尝试解决这个问题,我构建了一个循环(使用 SAS DIS 循环转换),其中我首先对数据集的行进行编号,然后一次以 10000 个名称的批次应用前面的逻辑。很长一段时间后,我遇到了同样的内存不足错误,但是当我检查我的目标表(Teradata)时,我注意到它运行并加载了除最后一次迭代之外的所有数据。当我将循环大小从 10000 切换到 1000 时,我看到了完全相同的行为。
出于测试目的,我只处理了大约 500K 行,但很快将不得不处理数百万行,并且担心这将如何工作。作为参考,我正在应用的清洁规则集目前是 20 行,但可能会增长到几百行。
- 使用带有规则的文件而不是直接在我的数据步骤中对正则表达式进行硬编码,效率会显着降低吗?
- 有什么方法可以实现这一点而不必循环?
- 由于我的数据集在每次循环迭代时都会被覆盖,对于 1000 行长(如 3 列)的数据集,怎么会出现内存不足错误?
- 最终,我该如何解决这个内存不足错误?
谢谢!