我一直在努力提高某些代码的速度。我删除了所有循环,使用向量并且几乎所有内容都流式传输。我已经对代码的每次迭代进行了定时,并且随着迭代次数的增加,它似乎变慢了。
### 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
和fields
个套餐。这是我的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但在我的情况下会有所帮助吗?并行处理怎么样,我想我可以搞清楚,但在这种情况下值得麻烦吗?
答案 0 :(得分:3)
我会关注@PaulHiemstra的建议并发表我的评论作为答案。谁可以抵制互联网积分? ;)
通过快速浏览一下代码,我同意@joran在评论中的第二点:由于重复读取数据,你的循环/功能可能会变慢。更具体地说,这部分代码可能需要修复:
read.table(data, skip=b, nrows=NoR, header=FALSE)
。
特别是,我认为skip=b
论证是罪魁祸首。如果可能,您应该在开头读入所有数据,然后从内存中检索必要的部分以进行计算。