我想测试系统选项bufnobufsize是否可以有效地提高数据集。

下面是测试代码:

    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,那么 bufnobufsize 的变化对运行时间影响不大。

但是很多论文都说bufnobufsize可以优化程序。也许是因为我在同一个 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/

10-13 00:43