1

我运行了以下代码,一个小时后,就在代码完成时发生了排序执行错误。我的代码有问题还是我的计算机处理器和内存不足

proc sql;

create table today as

select a.account_number, a.client_type, a.device ,a.entry_date_est,

    a.entry_time_est, a.duration_seconds, a.channel_name, b.esn, b.service_start_date,

    b.service_end_date, b.product_name, b.billing_frequency_fee, b.plan_category,

    b.plan_subtype, b.plan_type

    from listen_nomiss a  inner join service_nomiss b

    on (a.account_number = b.account_number)

    order by account_number;

quit;
4

2 回答 2

3

当您用完实用程序空间来执行排序时,最常见的是该错误。此 SAS 知识库文章中提供了一些故障排除建议;最有用的建议:

  • options fullstimer msglevel=i ;将为您提供有关幕后发生的事情的更多信息,因此您可以解决导致问题的原因
  • proc options option=utilloc; run;将告诉您实用程序目录在哪里,您的临时文件将在其中创建以进行排序。验证最终表所需的大约 3 倍空间可用 - 由于排序的处理方式,排序需要大约 3 倍的空间才能正确排序数据集。
  • OPTIONS COMPRESS;如果尚未启用,将节省一些(可能很多)空间。

options memsize;options sortsize;会告诉您分配给 SAS 的内存量,以及在内存中与在磁盘上进行排序的大小。 sortsize应该是大约 1/3 memsize(考虑到需要 3x 空间来处理它)。如果您的决赛桌在附近但刚刚结束,那么如果默认值太低(对于 memsize 也是如此)sortsize,您最好尝试增加。sortsize

您还可能遇到一些权限问题;kb 文章中的其他一些建议与验证您是否确实有权写入实用程序目录或它是否存在有关。

于 2013-08-06T17:07:23.570 回答
1

我过去有一个项目,其中资源也是一个问题。排序时有几种解决方法:

  • 不要忘记 proc sort 有一个 TAGSORT 选项,这将使它首先只对 by 语句变量进行排序,然后附加所有其他内容。在 by 语句中不涉及许多列时很有用。
  • 索引:如果你为你的 by 语句中的变量建立一个索引,你可以使用一个不排序的 by 语句,它将依赖于索引。
  • 拆分:您可以将数据集拆分为多个块并分别对每个块进行排序。然后您执行数据步骤,将它们全部放入 set 语句中。当您在那里也使用 by 语句时,SAS 将编织记录,以便结果也根据 by 语句。

请注意,这些方法会对性能产生影响(可能是第三种方法的影响较小),如果您以后不考虑它们(或故意破坏它们),索引可能会让您头疼。

如果/何时将整个联接重写为 SAS 合并,请注意:请记住,SAS 合并本身并不模拟多对多联接。(它是一对一、一对多和多对一的)可能不是这里的情况(很少是这样),但我提到它是为了安全起见。

于 2013-08-06T21:05:04.150 回答