SAS:巨大的文件/很多任务:将文件拆分成较小的,还是拆分任务?

时间:2015-06-28 21:30:06

标签: sas

我有高频财务数据(毫秒),大量列,137 mio观察/行,总大小32Gb。我想使用PROC TIMESERIES将观察结果汇总到30秒。我的初始命令涉及很多变量/任务。

proc timeseries data=DATA out= DATA_SEC30; 
id DATETIME interval=sec30 setmissing=missing align=beg start = '01jan1999.00:05'dt end = '01dec2014.00:00'dt; 
var TRADE BID ASK MID / accumulate=last;
var TIME / accumulate=last;
var OF VOL / accumulate=total;
var DATE / accumulate=N;
run;

如果我运行此代码,我会收到以下错误消息:

  

错误:无法分配足够的内存。至少要求312070K字节。您必须增加可用内存量,或以不同方式解决问题。

我的问题是解决问题的最佳方法是什么?

A)基于例如,将文件拆分为较小(非重叠)的文件。 date,然后在每个子文件上运行代码,并将它们放在一起? 或

B)按步骤拆分上面的代码,例如每个VAR语句一个,但在完整文件上运行?

答案可能是程序特定的,也可能是特定于计算机的(但我希望得到“一般”答案)。我使用PROC TIMESERIES,计算机是SAS分配大约256Gb内存的服务器。

2 个答案:

答案 0 :(得分:1)

首先,鉴于您的具体问题,我建议您联系SAS技术支持。你为SAS付出了很多钱,而你得到的一件事就是对这类问题提供近乎实时的支持 - 通常来自proc本身的开发人员。一旦你超越基本数据步骤和简单的procs,如SUMMARY / MEANS,TABULATE,FREQ等,并进入像TIMESERIES这样的高内存强度的东西,通常会有特定于proc的优化,你可以只做几个人很可能知道。

关于在 general 中解决此类问题的最佳方法,没有一个答案。当它不会影响结果时,最好是拆分观察而不是重新运行不同变量的proc。这是因为I / O限制;读取相同的32GB四次,而读取8GB四次,后者显然更好。当然,有时(例如在回归分析中)这会改变结果,因此不是优选的。

如果可能,您也可以使用BY语句来提供帮助。这避免了实际拆分数据集的必要性;相反,您有一些定义组的变量,并运行BY该ID,允许您在一次通过中通过一次调用运行proc,但有效地运行分析多次,并且只生成一个最终输出数据集。这通常(但不总是)避免了内存不足的情况。我不知道PROC TIMESERIES是否适用于此,但我认为这可能适用于你的情况。

以下是使用PROC TIMESERIES的the second example from the documentation的示例。首先,我在整个SASHELP.AIR数据集上运行它,然后是BY yeargroup(这是四舍五入到最接近的5的倍数)。注意SERIES数据集是如何相同的;因此,部分分析工作正常。但是SEASON数据集相同,因为BY组分析意味着您为每个BY值分别设置了四组季节。您需要了解PROC TIMESERIES如何处理您的数据,以了解BY组是否会影响事物。

 proc timeseries data=sashelp.air
                   out=series
                   outtrend=trend
                   outseason=season print=seasons;
      id date interval=qtr accumulate=avg;
      var air;
   run;



data air;
  set sashelp.air;
  yeargroup = round(year(date),5);
run;

 proc timeseries data=work.air
                   out=series2
                   outtrend=trend
                   outseason=season print=seasons;
      by yeargroup;
      id date interval=qtr accumulate=avg;
      var air;
   run;

   proc compare base=series compare=series2;
   run;

答案 1 :(得分:0)

为了在编写最小量的代码和资源效率之间进行合理的折衷,我可能会使用不同的数据集选项多次运行proc timeseries,例如

proc timeseries data=DATA(firstobs = 1 obs = 10000000)...
proc timeseries data=DATA(firstobs = 10000001 obs = 20000000)...

在你的情况下,看起来只需将处理分成两次就足够了。像这样使用obsfirstobs可以避免创建索引或临时数据集,也可以避免两次读取整个数据集,因为SAS只需要在第二次运行中寻找firstobs的位置,即没有实际上阅读任何先前的观察结果。

根据您使用proc timeseries所做的事情的复杂程度以及是否有其他人需要在您的服务器上使用大量内存,您可能会发现编写等效数据是值得的步。这将为您提供一次通过的单个输出数据集,并且将消耗更少的内存(可能只有几百KB),但可能需要更多的工作来编写和维护。