performance - 提高性能/速度

标签 performance r loops raster

我需要从 1303 个栅格中获取数据(每个栅格包含 1 个月的数据),并为栅格中的每个网格单元创建一个时间序列。最后,我将把所有时间序列加入到一个巨大的(zoo)文件中。

我有可以做到这一点的代码(我尝试了数据集的一小部分并且它有效),但似乎只需要堆叠栅格就需要永远(现在超过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=",")
}

最佳答案

第一位可以简单地是:

s <- stack(files) 

创建堆栈有点慢的原因是每个文件都需要打开并检查它是否具有与其他文件相同的 nrow、ncol 等。如果您绝对确定是这种情况,您可以使用这样的快捷方式(通常不推荐)

quickStack <- function(f) {
r <- raster(f[1])
ln <- extension(basename(f), '')
s <- stack(r)
s@layers <- sapply(1:length(f), function(x){ r@file@name = f[x]; r@layernames=ln[x]; r@data@haveminmax=FALSE ; r })
s@layernames <- ln
s
}

quickStack(files)

您或许还可以加快第二部分的速度,如下面的示例所示,具体取决于您拥有多少 RAM。

逐行读取:

for (lat in 1:360) {
pet <- getValues(s, lat, 1)
for (long in 1:720) {
    x <- xts(pet[long,], dat)
    write.zoo(x,file=paste("P:/WRSRL/Users1/ncgk/IBERIA/cru_pet/zoo/","lat",lat,"long",long,".csv", sep="")  , sep=",")
}
}

更极端的是,一次性读取所有值:

 pet <- getValues(s)
 for (lat in 1:360) {
for (long in 1:720) {
    cell <- (lat-1) * 720 + long
    x <- xts(pet[cell,], dat)
    write.zoo(x,file=paste("P:/WRSRL/Users1/ncgk/IBERIA/cru_pet/zoo/","lat",lat,"long",long,".csv", sep="")  , sep=",")
}
}

关于performance - 提高性能/速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9929324/

相关文章:

javascript - 循环多维 UL 生成 javascript 数组

R 舍入到最接近的 0.5 或 0.1

javascript - 如何在 Javascript 中执行 "for ...in ...."循环?

performance - 通过交错向量加速组装矩阵?

c - 在传递给函数和访问存储在 C 中的值时有效地使用结构的结构

r - 重复执行矩阵乘法的有效方法

java - Java 中内存分配的典型速度是多少?

r - 将函数标记为 data.table-unaware

r - 在 R 中沿着整个数据集创建一个按一定数量递增的序列

loops - 在 BigQuery 中使用 declare 和 loop 来插入数据