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)
}
要测试removeprint(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