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数据步骤中测试IO吞吐量?_Performance_Optimization_Sas_Performance Testing - Fatal编程技术网

Performance 如何在SAS数据步骤中测试IO吞吐量?

Performance 如何在SAS数据步骤中测试IO吞吐量?,performance,optimization,sas,performance-testing,Performance,Optimization,Sas,Performance Testing,我想测试系统选项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;

我想测试系统选项
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会话中运行所有代码,所以我没有准确地进行度量。我的问题是:我是否应该在单独的会话中测试每个代码运行时,是否需要选择一个更大的数据集?如果数据集非常大,BUFSIZE通常只会在增加时提高性能,我的意思是,非常大的数据集除了有许多行之外,还有很多行数据。它所做的是确定每次传递读取的数据量;如果您有80字节的行,那么4096的bufsize甚至可以读取大量的观察结果。另一方面,如果有2056字节的行,那么4096页将只包含一个观察值;所以每次观察你都要读一页新的内容,这很慢

BUFNO没有任何价值,除非您使用的是SGIO,据我所知,一般不推荐使用SGIO

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

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


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

我认为SAS不会报告磁盘I/O使用情况。假设您在Windows中运行,则必须使用诸如Performance Monitor(开始->运行->键入'perfmon')之类的程序,或者使用一个简单的可视程序(类似于任务管理器,但更详细地显示磁盘/网络IO等)

IMO将I/O降至最低的最简单方法是(按努力回报的顺序):

  • 使用压缩
  • (正如Joe所建议的)尽可能减少程序解析数据的次数(如果需要多个步骤,请考虑使用视图进行中间步骤)
  • 确保变量的长度不超过需要的长度。删除任何不必要的变量

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

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

    使用奇偶校验RAID格式(如RAID5),数据分布在磁盘上,并计算奇偶校验,因此最好总是将数据写入这样的块中,以便所有磁盘都得到更新,并立即计算奇偶校验(无部分更新)

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


    关于SAS I/O的非常好的文档:

    感谢您的帮助。我是否有其他方法来提高IO吞吐量,增强memsize的使用,因为通过windows任务管理器,我发现SAS程序总是使用小于100M的内存大小。MEMSIZE是否应等于总可用内存大小?现在我的计算机有32G内存。MEMSIZE肯定应小于32G,因为您不想使用所有内存,否则Windows将崩溃。SAS在正常运行时不使用大量内存;但这并不能阻止它在需要时使用更多的内存(最大为MEMSIZE)。因此,如果它的存储容量为100MB,但需要对2GB数据集进行排序,并且MEMSIZE为24GB,SORTSIZE为8GB,则在对数据集进行排序时,它将扩展到6GB。此外,BufsSize仅影响现有数据集tune.dds_dep_pagesize16k的写入,而不影响现有数据集tune.dds_dep_pagesize16k的读取,其BufsSize在创建时已固定。对于整个测试,数据可能在文件系统缓存中,因此I/O的大小几乎没有影响。使用大于总可用RAM的数据集进行测试将显示不同的结果。谢谢。我已经设置了压缩选项。然后我发现一个页面可以包含更多的观察结果,即使obslen相对于它的BUFSIZE非常长。是否需要使用更大的数据集完全取决于您将在生产环境中处理的数据集的大小。