Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance SAS:避免在HD上的每个datastep中写入文件_Performance_Sas - Fatal编程技术网

Performance SAS:避免在HD上的每个datastep中写入文件

Performance SAS:避免在HD上的每个datastep中写入文件,performance,sas,Performance,Sas,是否可以避免在SAS中的每个数据步骤中写入文件? 例如,我从我的HD上的两个SAS数据集开始,分别称为have1和have2。然后,我执行以下简单的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

是否可以避免在SAS中的每个数据步骤中写入文件? 例如,我从我的HD上的两个SAS数据集开始,分别称为
have1
have2
。然后,我执行以下简单的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 have4上写入?[事实上,我使用散列对象进行合并]


have3
是一个大数据集,因此如果我可以避免在每个数据步骤都在我的硬盘上写入数据,那就太好了。

你问题的大致答案是,是的,你可以避免一些步骤;在某些情况下,您可以使用
视图
来避免写出数据集。您还可以使用内存库(
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的预先存在的数据集,否则它将失败。

您的问题的大致答案是,是的,您可以避免一些步骤;在某些情况下,您可以使用
视图
来避免写出数据集。您还可以使用内存库(
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的现有数据集,否则它将失败。

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

proc datasets;
 delete have1 have2;
run; 

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

proc datasets;
 delete have1 have2;
run; 

很好的课堂陈述建议。同样值得注意的是(正如OP所提到的,它是一个大数据集),在class语句上使用
/groupinternal
选项可能是值得的,因为这可以显著加快它的速度(只要类变量没有按格式化值分组)。有趣的是,我不知道这一点。不幸的是,我通常会对格式化的值进行分组,但我会记住这一点,以备将来使用
确实有帮助!它将处理时间缩短了一半!使用类和视图选项,我将处理时间减少了80%…这是非常重要的。谢谢@乔很高兴我终于能报答你的恩惠,教你一些新东西,换换口味;-)很好的课堂陈述建议。同样值得注意的是(正如OP所提到的,它是一个大数据集),在class语句上使用
/groupinternal
选项可能是值得的,因为这可以显著加快它的速度(只要类变量没有按格式化值分组)。有趣的是,我不知道这一点。不幸的是,我通常会对格式化的值进行分组,但我会记住这一点,以备将来使用
确实有帮助!它将处理时间缩短了一半!使用类和视图选项,我将处理时间减少了80%…这是非常重要的。谢谢@乔很高兴我终于能报答你的恩惠,教你一些新东西,换换口味;-)