3

我想测试一下系统选项是否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

不过很多论文都说bufno可以bufsize优化程序。也许是因为我在同一个 SAS 会话中运行所有代码,所以我没有准确测量。我的问题是:我是否应该在单独的会话中测试每个代码运行时间,是否需要选择更大的数据集?

4

3 回答 3

4

如果数据集非常大,BUFSIZE 通常只会在增加时提高性能,并且非常大的意思是除了有很多行之外,一行中还有很多数据。它的作用是确定每次通过时读取多少数据;毕竟,如果你有 80 字节的行,4096 的 bufsize 甚至会读取大量的观察结果。另一方面,如果您有 2056 字节的行,那么 4096 页面将只包含一个观察;所以你必须为每个观察阅读一个新页面,这很慢。

除非您使用的是 SGIO,否则 BUFNO 没有任何价值,据我回忆,通常不推荐使用它。

具体回答最后一个问题:无需为这些选项启动新的 SAS 会话。如果您有更大的数据集,BUFSIZE 可能会有一些额外的好处。

一般来说,我建议您更多地关注您的代码而不是系统选项来优化您的运行。只要您使用较大的内存空间(在您的机器上尽可能多,至少几 GB),您可能不会从处理系统选项中获得太多收益。如果您可以消除一些数据传递,您将获得更多。

一个例外是 SORTSIZE - 将其设置为 MEMSIZE 的 1/3。如果你有 2GB MEMSIZE,那么 SORTSIZE 应该是 667M。这决定了您可以在内存中对多大的数据集进行排序,并且由于某种原因通常非常小。

于 2012-11-07T06:54:21.710 回答
1

谈到任何严重的数据处理活动,我认为这总是发生在某个磁盘阵列上——这可能是很多事情,但至少这意味着有几个磁盘采用某种 RAID 格式。因此,要优化 SAS I/O 性能一直到磁盘,您必须考虑存储技术。

在这里,BUFSIZE 选项非常有用,可以使应用程序 I/O 模式与存储特性保持一致。最常见的情况是使用 RAID10 或 RAID5 格式,其中数据以特定大小的块分布在磁盘上 - 最好让 BUFSIZE 与此块大小或条带大小对齐(1:1 或倍数)。您应该向您的存储管理员咨询此大小 - 它需要 64kB 及其倍数。

对于像 RAID5 这样的奇偶校验 RAID 格式,数据分布在磁盘上加上奇偶校验计算,因此最好始终将数据写入这样的块中,以便所有磁盘都得到更新并立即计算它们的奇偶校验(没有部分更新)。

因此,为简单起见,对于奇偶校验磁盘,您可以将 BUFSIZE 设置为条带大小乘以(阵列中的磁盘数减 1)。或者,您可以尝试将其与 BUFNO 结合以实现倍数。

关于 SAS I/O 的非常好的文档:为 SAS 9 应用程序配置 IO 子系统的最佳实践

于 2012-11-09T09:21:00.163 回答
0

我不相信 SAS 会报告磁盘 I/O 使用情况。假设您在 Windows 中运行,则必须使用诸如性能监视器之类的程序(开始->运行->键入“perfmon”),或者为了获得简单的视觉效果,您可以使用进程资源管理器(类似于任务管理器,但显示磁盘/network IO 等更详细)。

IMO 最小化 I/O 的最简单方法是(按奖励顺序):

  1. 使用压缩
  2. (正如 Joe 建议的那样)尽量减少程序解析数据的次数(如果需要多个步骤,请考虑将视图用于中间步骤)
  3. 确保您的变量不超过所需的长度。删除任何不必要的变量。
于 2012-11-07T18:27:45.460 回答