我需要從1303柵格(每個柵格有1個月的數據)中獲取數據,併爲柵格中的每個柵格單元創建一個時間序列。最後,我會將所有時間序列合併成一個大型(動物園)文件。提高性能/速度
我有代碼可以做到這一點(我嘗試了一小部分數據集,它的工作原理),但它似乎只是堆疊柵格(現在超過2小時,仍然在計數)和這不是較慢的部分,這將是時間序列。所以這裏是我的代碼,如果有人知道更快的方式來堆疊柵格和/或創建時間序列(也許沒有雙循環?)請幫助...
我不知道任何其他編程語言,但這對R來說太過分了嗎?
files <- list.files(pattern=".asc")
pat <- "^.*pet_([0-9]{1,})_([0-9]{1,}).asc$"
ord_files <- as.Date(gsub(pat, sprintf("%s-%s-01", "\\1", "\\2"), files))
files<-files[order(ord_files)]
#using "raster" package to import data
s<- raster(files[1])
pet<-vector()
for (i in 2:length(files))
{
r<- raster(files[i])
s <- stack(s, r)
}
#creating a data vector
beginning = as.Date("1901-01-01")
full <- seq(beginning, by='1 month', length=length(files))
dat<-as.yearmon(full)
#building the time series
for (lat in 1:360)
for (long in 1:720)
{
pet<-as.vector(s[lat,long])
x <- xts(pet, dat)
write.zoo(x,file=paste("P:/WRSRL/Users1/ncgk/IBERIA/cru_pet/zoo/","lat",lat,"long",long,".csv", sep="") , sep=",")
}
的問題是,這部分的代碼需要多少時間。最後一個雙循環將執行360 * 720次,這是很多。如果你有多個CPU,你可以並行運行(看看foreach)。 – smu 2012-03-29 17:19:08
我仍在努力導入所有的文件,我認爲在閱讀了幾篇文章之後,光柵包是最好的選擇,但我不確定它是否適用於1303文件。但'read.table'更糟! – sbg 2012-03-29 17:31:45
然後問題可能如下:對於每次迭代R需要分配一個新的對象S與增加的大小。這種分配會花費很多時間。在循環之前分配s可能會更快。我給你一個簡單的例子: 你的方式: 's = c()'; (1:10){s < - c(s,rnorm(100))}' 更快: 's = rep(NA,1000)'; '(我在seq(1,10 * 100,100)){s [i:(i + 99)] - rnorm(100)}'(對不起,這看起來很難看) – smu 2012-03-29 17:40:13