我想测试系统选项bufno
和bufsize
是否可以提高数据集效率。
这是测试代码:
options bufno=1 bufsize=16k;
%atstart;
data target.dds_dep_pagesize16k;
set tune.dds_dep_pagesize16k(obs=2000000);
run;
%atend;
options bufno=100 bufsize=32k;
%atstart;
data target.dds_dep_pagesize16k;
set tune.dds_dep_pagesize16k(obs=2000000);
run;
%atend;
...
...
%atstart
和%atend
用于计算它们之间的程序运行时间。
如果数据集的大小约为800 Mb,则bufno
和bufsize
的更改对运行时间影响不大。
然而,许多论文称bufno
和bufsize
可以优化该计划。也许是因为我在同一个SAS会话中运行所有代码,我没有准确测量。我的问题是:我应该在单独的会话中测试每个代码运行时间吗?我是否需要选择更大的数据集?
答案 0 :(得分:4)
如果数据集非常大,BUFSIZE通常只会在增加时提高性能,而且非常大,我的意思是除了有很多行外,还有一行中有很多数据。它的作用是确定每次传递读取的数据量;如果你有80字节的行,那么4096的bufsize甚至会读取大量的观察结果。另一方面,如果你有2056字节的行,那么4096页只包含一个观察点;所以你必须为每次观察读一个新页面,这很慢。
BUFNO没有任何价值,除非您使用的是SGIO,我记得通常不建议这样做。
在最后一个问题的具体答案中:无需为这些选项启动新的SAS会话。如果您有更大的数据集,BUFSIZE可能会有一些额外的好处。
一般来说,我会建议您更多地查看代码而不是系统选项以优化运行。只要您使用大量内存空间(尽可能在您的计算机上使用,至少几GB),您可能不会因为系统选项而花费太多。如果你可以取消一些数据传递,你将获得更多。
一个例外是SORTSIZE - 将其设置为MEMSIZE的1/3。如果你有2GB的MEMSIZE,那么SORTSIZE应该是667M。这决定了您可以在内存中排序的数据集的大小,并且由于某种原因通常非常小。
答案 1 :(得分:1)
谈到任何严肃的数据处理活动,我认为这总是发生在一些磁盘阵列上 - 这可能是很多东西,但至少它意味着有一些RAID格式的磁盘。 因此,为了优化SAS I / O性能一直到磁盘,您必须考虑存储技术。
此处,BUFSIZE选项对于将应用程序I / O模式与存储的特征对齐非常有用。 最常见的情况是使用RAID10或RAID5格式,其中数据以特定大小的块分布在磁盘上 - 将BUFSIZE与此块大小(或条带大小)对齐(1:1或多个)是很好的。你应该咨询存储管理员这个大小 - 它就像64kB及其倍数。
使用像RAID5这样的奇偶校验RAID格式,数据分布在磁盘上并且计算奇偶校验,因此总是以这种块的形式写入数据,以便所有磁盘都可以立即计算所有磁盘的更新和奇偶校验(无需部分更新) )。
为简单起见,对于奇偶校验磁盘,您可以将BUFSIZE设置为条带大小乘以(数组中磁盘数减1)。或者,您可以尝试将其与BUFNO结合使用以实现倍数。
关于SAS I / O的非常好的文档:Best Practices for Configuring your IO Subsystem for SAS 9 Applications
答案 2 :(得分:0)
我不相信SAS会报告磁盘I / O使用情况。假设您在Windows中运行,则必须使用诸如性能监视器(Start-> Run-> Type in'perfmon')之类的程序,或者对于简单的视觉效果,您可以使用Process Explorer(这就像任务管理器,但更详细地显示磁盘/网络IO等。)
IMO最简化I / O的方法是(按努力奖励的顺序):