R代码随着迭代次数的增加而减慢

时间:2013-11-21 20:41:39

标签: r runtime lapply

我一直在努力提高某些代码的速度。我删除了所有循环,使用向量并且几乎所有内容都流式传输。我已经对代码的每次迭代进行了定时,并且随着迭代次数的增加,它似乎变慢了。

### The beginning iterations
   user  system elapsed 
   0.03    0.00    0.03 
   user  system elapsed 
   0.03    0.00    0.04 
   user  system elapsed 
   0.03    0.00    0.03 
   user  system elapsed 
   0.04    0.00    0.05 

### The ending iterations
   user  system elapsed 
   3.06    0.08    3.14 
   user  system elapsed 
   3.10    0.05    3.15 
   user  system elapsed 
   3.08    0.06    3.15 
   user  system elapsed 
   3.30    0.06    3.37 

我有598次迭代,现在需要大约10分钟。我想加快速度。这是我的代码的样子。您需要RColorBrewerfields个套餐。这是我的data。是的,我知道它很大,请确保您下载zip文件。

    StreamFlux <- function(data,NoR,NTS){
###Read in data to display points###
       WLX = c(8,19,29,20,13,20,21)
       WLY = c(25,28,25,21,17,14,12)
       WLY = 34 - WLY
       WLX = WLX / 44
       WLY = WLY / 33
       timedata = NULL
       mf <- function(i){
       b = (NoR+8) * (i-1) + 8

          ###I read in data one section at a time to avoid headers
          mydata = read.table(data,skip=b,nrows=NoR, header=FALSE)
          rows = 34-mydata[,2]
          cols = 45-mydata[,3]
          flows = mydata[,7]
          rows = as.numeric(rows)
          cols = as.numeric(cols)
          rm(mydata)

          ###Create Flux matrix
          flow_mat <- matrix(0,44,33)

          ###Populate matrix###
          flow_mat[(rows - 1) * 44 + (45-cols)] <- flows+flow_mat[(rows - 1) * 44 + (45-cols)]
          flow_mat[flow_mat == 0] <- NA
          rm(flows)
          rm(rows)
          rm(cols)
          timestep = i

          ###Specifying jpeg info###
          jpeg(paste("Steamflow", timestep, ".jpg",sep = ''),
               width = 640, height=441,quality=75,bg="grey")
          image.plot(flow_mat, zlim=c(-1,1), 
                     col=brewer.pal(11, "RdBu"),yaxt="n",
                     xaxt="n", main=paste("Stress Period ", 
                     timestep, sep = ""))
          points(WLX,WLY)
          dev.off()
          rm(flow_mat)
   }
   ST<- function(x){functiontime=system.time(mf(x))
   print(functiontime)}
   lapply(1:NTS, ST)
}

这是运行函数

的方法
###To run all timesteps###
StreamFlux("stream_out.txt",687,598)
###To run the first 100 timesteps###
StreamFlux("stream_out.txt",687,100)
###The first 200 timesteps###
StreamFlux("stream_out.txt",687,200)

要测试删除print(functiontime)以在每个时间步点停止打印

> system.time(StreamFlux("stream_out.txt",687,100))
  user  system elapsed 
  28.22    1.06   32.67 
> system.time(StreamFlux("stream_out.txt",687,200))
   user  system elapsed 
 102.61    2.98  106.20 

我正在寻找的是加速运行此代码,并可能解释为什么它正在放慢速度?我应该只是部分运行它,似乎是一个愚蠢的解决方案。我从dlply了解了plyr。它似乎有效here但在我的情况下会有所帮助吗?并行处理怎么样,我想我可以搞清楚,但在这种情况下值得麻烦吗?

1 个答案:

答案 0 :(得分:3)

我会关注@PaulHiemstra的建议并发表我的评论作为答案。谁可以抵制互联网积分? ;)

通过快速浏览一下代码,我同意@joran在评论中的第二点:由于重复读取数据,你的循环/功能可能会变慢。更具体地说,这部分代码可能需要修复:

read.table(data, skip=b, nrows=NoR, header=FALSE)

特别是,我认为skip=b论证是罪魁祸首。如果可能,您应该在开头读入所有数据,然后从内存中检索必要的部分以进行计算。