首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAS:大型文件/许多任务:将文件拆分为较小的文件,还是将任务拆分?

SAS:大型文件/许多任务:将文件拆分为较小的文件,还是将任务拆分?
EN

Stack Overflow用户
提问于 2015-06-28 21:30:06
回答 2查看 260关注 0票数 2

我有高频金融数据(毫秒),很多列,137兆观测/线,总大小为32 of。我想将观察结果聚合到30秒内,使用PROC时间序列。我的初始命令涉及相当多的变量/任务。

代码语言:javascript
复制
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)基于eg将文件拆分成较小(不重叠)文件。日期,然后在每个子文件上运行上面的代码,并将它们放在最后?或

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

答案可能是特定于程序的,也可能是特定于计算机的(但我希望得到一个“一般”的答案)。我使用PROC时间序列,计算机是一台服务器,其中SAS被分配到256 is内存。

EN

回答 2

Stack Overflow用户

发布于 2015-06-29 03:56:59

首先,鉴于您的特殊问题,我鼓励您联系SAS技术支持。你为SAS花了很多钱,而你得到的一件事就是在这样的问题上几乎是实时的支持--通常是来自proc本身的开发人员。一旦你超越了基本的数据步骤和简单的过程,如摘要/方法、表格、FREQ等等,进入高记忆强度的东西,比如TIMESERIES,通常会有特定于proc的优化,你可以这样做,只有少数人可能知道。

至于在一般情况下,怎样才是处理这类问题的最佳方法,并没有一个答案。当它不会影响结果时,它可能会更好地分裂观察,而不是对不同的变量重新运行proc。这是因为I/O限制;相同的32 8GB阅读4次与读8 8GB 4次相比,后者显然更好。当然,有时(例如在回归分析中)这会改变结果,因此并不可取。

如果可能的话,您也可以使用BY语句来帮助您。这避免了实际拆分数据集的必要性;相反,您有一些变量定义了一个组,并由该ID运行,允许您在一次传递中使用一个调用来运行proc,但是可以有效地多次运行分析,并且只生成一个最终的输出数据集。这通常(但并不总是)避免内存不足的情况。我不知道时间序列是否能解决这个问题,但我认为在你的情况下可能会这样。

下面是一个示例,使用PROC TIMESERIES的文档中的第二个示例。首先,我在整个SASHELP.AIR数据集上运行它,然后按年份组(即将年份四舍五入到最接近的倍数5)。请注意系列数据集是如何相同的;因此,这部分分析工作得很好。但是季节数据集并不相同,因为BY组分析意味着每个Seasons值都有单独的Seasons集。您需要了解PROC TIMESERIES是如何处理您的数据的,以了解BY组是否会影响事物。

代码语言:javascript
复制
 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
EN

Stack Overflow用户

发布于 2015-06-28 22:26:15

为了在编写最少的代码和资源效率之间找到一个合理的折衷方案,我可能会使用不同的数据集选项多次运行proc timeseries。

代码语言:javascript
复制
proc timeseries data=DATA(firstobs = 1 obs = 10000000)...
proc timeseries data=DATA(firstobs = 10000001 obs = 20000000)...

在您的示例中,似乎只需将处理分成两次运行就足够了。像这样使用obsfirstobs可以避免创建索引或临时数据集,也避免了两次读取整个数据集,因为SAS只需要在第二次运行中查找firstobs的位置,即不实际读取任何先前的观察结果。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31104955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档