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

R代码随着迭代次数的增加而变慢,r,runtime,lapply,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

我一直在努力提高一些代码的速度。我已经删除了所有的循环,正在使用矢量,并且几乎所有的东西都用了流线型线条。我已经对代码的每次迭代进行了计时,并且随着迭代次数的增加,它似乎会变慢

### 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分钟。我想加快速度。下面是我的代码的外观。您需要
RColorBrewer
字段
包。这是我的。是的,我知道它很大,一定要下载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)
}
要测试remove
print(functiontime)
,请在每个时间步停止打印
我想要的是加速运行这段代码,并解释为什么它会慢下来?我应该把它分成几个部分,这似乎是一个愚蠢的解决方案。我已经从
plyr
上读到了关于
dlply
。这似乎奏效了,但这对我有帮助吗?并行处理怎么样,我想我能弄明白,但在这种情况下值得麻烦吗?

我会按照@PaulHiemstra的建议,发表我的评论作为答案。谁能抵制互联网积分

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

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


特别是,我认为
skip=b
参数是罪魁祸首。如果可能的话,您应该在开始时阅读所有数据,然后从内存中检索计算所需的部分。

我将遵循@PaulHiemstra的建议,并将我的评论作为答案发布。谁能抵制互联网积分

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

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


特别是,我认为
skip=b
参数是罪魁祸首。如果可能的话,您应该在开始时阅读所有数据,然后从内存中检索计算所需的部分。

我将遵循@PaulHiemstra的建议,并将我的评论作为答案发布。谁能抵制互联网积分

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

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


特别是,我认为
skip=b
参数是罪魁祸首。如果可能的话,您应该在开始时阅读所有数据,然后从内存中检索计算所需的部分。

我将遵循@PaulHiemstra的建议,并将我的评论作为答案发布。谁能抵制互联网积分

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

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



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

先自己动手,把你的问题提炼到一个你遇到问题的最小例子。我不会花时间在这么大和复杂的例子上。但给你两条建议:(1)使用
RProf
来确定哪些部分是瓶颈;(2)我敢打赌,你从磁盘读取连续部分的策略是非常次优的。触摸(可能是旋转)磁盘的速度很慢。一次读入所有数据。即使如此,您仍试图将数百个绘图写入磁盘。这也不会太快,取决于你的硬盘。@eddi我一直在努力改进这段代码。如果我知道我的问题的根源是什么,我会发布一个最小的示例,就像我在简化过程中对代码的其他部分所做的那样。我不确定问题出在哪里,所以我想让大家看看完整的代码。我发布的内容有什么复杂之处?我所做的就是格式化数据,绘制数据,然后用
lappy
重复。甚至不需要ST函数。它只是用来打印运行时间的。快速浏览一下,我同意@joran关于(2)的观点。由于这部分代码,您的循环速度可能会减慢:
read.table(data,skip=b,nrows=NoR,header=FALSE)
。特别是,我认为
skip=b
部分是罪魁祸首。如果可能的话,您应该在开始时读入所有数据,然后从内存中检索计算所需的部分。@ialm您能将您提供的信息作为答案发布吗。这样一来,问题就很明显得到了回答,你会获得一些声誉。首先,你自己做一些工作,把你的问题提炼成一个你遇到问题的最小例子。我不会花任何时间在这么大和复杂的例子上。但给你两条建议:(1)使用
RProf
来确定哪些部分是瓶颈;(2)我敢打赌,你从磁盘读取连续部分的策略是非常次优的。触摸(可能是旋转)磁盘的速度很慢。一次读入所有数据。即使如此,您仍试图将数百个绘图写入磁盘。这也不会太快,取决于你的硬盘。@eddi我一直在努力改进这段代码。如果我知道我的问题的根源是什么,我会
###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)
> 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