SAS:避免在HD上的每个datastep上写一个文件

时间:2014-01-23 20:09:21

标签: performance sas

是否可以避免在SAS的每个datastep中写入文件? 例如,我在我的HD上开始使用两个名为have1have2的SAS数据集。然后我做了这些简单的SAS数据步骤:

data have3;
merge have1 have2; by id;run;

data have3; set have3;
if id='5' then delete;run;

proc sort data=have3; by id;run;

proc summary data=have3;
by id;
output out=have4
sum(expense)=expense;
run;

我可以在内存中执行前2个数据步骤和proc sort,然后在HD has4上写入吗? [实际上我使用哈希对象进行合并]。

have3是一个很大的数据集,所以如果我能避免在每个数据步骤上都能在我的HD上写入数据那么好。

2 个答案:

答案 0 :(得分:4)

你的问题的广泛答案是肯定的,你可以避免一些步骤;在某些情况下,您可以使用view来避免写出数据集。您还可以使用内存库(ramlib)在内存中而不是在硬盘上定义库。

在您的具体情况下,无论如何,似乎某些处理是不必要的。

data have3;
merge have1 have2; by id;run;

data have3; set have3;
if id='5' then delete;run;

proc sort data=have3; by id;run;

proc summary data=have3;
by id;
output out=have4
sum(expense)=expense;
run;

可能是

data have3;
merge have1 have2;
by id;
if id='5' then delete;
run;

proc summary data=have3;
class id;
output out=have4 sum(expense)=expense;
run;

Class不需要排序,在这种情况下可以像by一样有效地工作。没有理由将合并和删除分开(更有效的方法是在传入的数据集上使用where语句)。

如果您愿意,您甚至可以将have3定义为视图。

data have3 /view=have3;  *other code is the same;

在这种情况下,您不能拥有名为have3的预先存在的数据集,否则它将失败。

答案 1 :(得分:0)

还有另一种更原始​​但简单的方法来清理程序生成的各种数据集。 Proc数据集不会阻止创建文件,但您可以使用它来删除任何已失效的数据。此示例将删除has1和have2。

proc datasets;
 delete have1 have2;
run;