如何优化大数据分析的迭代函数?

时间:2014-11-19 00:48:24

标签: r for-loop optimization while-loop

我有优化模型的问题。我的函数在迭代过程中递增变量(Dem)的值,以达到“WHILE”中设置的条件。

我不得不使用“FOR”和一些“IF”,我知道这会在R环境中进行非常缓慢的处理,但我必须在R中进行。 变量P是10958 obs的长度。变量A和C的长度为65511 obs。

使用system.time(myfunction),只使用变量Area [1]和C [1]中的一个元素,我的电脑需要2.5秒才能完成整个过程。但是对于Area和C的所有元素都需要45个小时。

我的教授说它太慢了,但我认为对于数据量是正常的,有一种方法可以优化这个吗?应该选择使用WHILE来优化函数(PSO,DEoptim等)吗?

myfunction = function(P,Area,C,Cap,Inc){      
  Vin<- Cap
  Q<-NA
  Ov<-NA
  Def<-NA
  Vf<-NA
  Vp<-NA
  Dem<-0
  Dem_100<-NA
  Fail<-0

  for (i in 1:length(Area)){        
    while(Fail==0){          
      Dem<-Dem+Inc          
      for (j in 1:length(P)){             
        #-----------------------------------------------------------------------#    
        ####################### Calculate Q #####################################
        #-----------------------------------------------------------------------#           
        if (P[j]==0){
          Q<-0
        }else{
          Q<-P[j]*Area[i]*C[i]
        }

        #-----------------------------------------------------------------------  
        ################################ Calculate Vp ##########################
        #-----------------------------------------------------------------------            
        Vp<- (Vin + Q) - Dem         
        if(Vp<0){
          Fail<-1
          break #stop For j and continue the while
        }

        #----------------------------------------------------------------------  
        ###################################### Calculate OV ###################
        #----------------------------------------------------------------------
        if (Vp>Cap){              
          Ov<-Vp-Cap          
        }else{ 
          Ov<-0
        }

        #---------------------------------------------------------------------
        ######################################## Calculate Def ###############
        #---------------------------------------------------------------------   
        if (Vp<0){ 
          Def<-0-Vp
        }else{
          Def<-0
        }

        #---------------------------------------------------------------------#    
        ################################## Calculate Vf ###########
        #---------------------------------------------------------------------#            
        if (Vp>Cap){
          Vf<-Cap
        }else{
          if (Vp<0) {
            Vf<-0
          }else{
            Vf<-Vp
          }
        }

        #-----------------------------------------------------------------------#    
        ################################## Update Vin ###########
        #-----------------------------------------------------------------------#            
        Vin<-Vf           
      }
      Vin<- Cap # Reset the var Vin for new j
    }

    Dem_100[i]<-Dem-Inc
    Def<-NA
    Dem<-0
    Vin<- Cap
    Fail<-0
 }
  return(list(DemGar100=Dem_100))
}

测试时间过程

P<-abs(rnorm(10958))
system.time(myfunction(P = P,Area = 100,C = 0.8,Cap = 10000,Inc = 1))
   user  system elapsed 
   2.45    0.00    2.50

1 个答案:

答案 0 :(得分:0)

没有足够的代表发表评论,但由于没有完整答案,它应该去那里。

你有没有想过用ifelse替换一些ifs?这应该加快速度 例如,您可以用以下内容替换整个j循环:

  

for(i in 1:length(Area)){
      而(失败== 0){
      DEM&LT; -Dem +公司
      Q&lt; -elelse(P == 0,0,P * Area [i] * C [i])## note Q是长度为(P)的向量       ......

另外我认为Def似乎永远不会计算(当Vp <= Cap时Vf总是Vp),因为如果Vp <0你跳出j循环甚至可能是while(你设置失败为1) ,但我不知道什么时候R检查条件,在周期结束时?或者开始)