我想测试系统选项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 session 中运行所有代码,我没有准确测量。我的问题是: 我应该在单独的 session 中测试每个代码运行时吗,我是否需要选择更大的数据集? 最佳答案
如果数据集非常大,BUFSIZE 通常只会在增加时提高性能,非常大我的意思是除了有很多行之外还有很多数据在一行中。它的作用是确定每次通过读取多少数据;毕竟,如果你有 80 字节的行,4096 的 bufsize 甚至会读取大量的观察结果。另一方面,如果您有 2056 字节的行,那么 4096 页将只包含一个观察值;所以你必须为每个观察读一个新页面,这很慢。
除非您使用 SGIO,否则 BUFNO 没有任何值(value),据我所知,通常不推荐使用 SGIO。
在最后一个问题的具体答案中:无需为这些选项启动新的 SAS session 。如果你有一个更大的数据集,BUFSIZE 可能会有一些额外的好处。
一般来说,我会建议更多地查看您的代码而不是系统选项来优化您的运行。只要您使用大内存空间(在您的机器上尽可能多,至少几 GB),您可能不会从系统选项中获得太多 yield 。如果您可以消除一些数据传递,您将获得更多。
一个异常(exception)是 SORTSIZE - 将其设置为 MEMSIZE 的 1/3。如果您有 2GB MEMSIZE,那么 SORTSIZE 应该是 667M。这决定了您可以在内存中排序的数据集有多大,并且由于某种原因通常非常小。
关于performance - 如何在 SAS DATA Step 中测试 IO 吞吐量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13264020/