我正在运行此for loop
而没有任何问题,但需要很长时间。我想应用家庭可以更快,但不知道如何。任何提示?
set.seed(1)
nrows <- 1200
ncols <- 1000
outmat <- matrix(NA, nrows, ncols)
dat <- matrix(5, nrows, ncols)
for (nc in 1 : ncols){
for(nr in 1 : nrows){
val <- dat[nr, nc]
if(!is.na(val)){
file <- readBin(dir2[val], numeric(), size = 4, n = 1200*1000)
# my real data where dir2 is a list of files
# "dir2 <- list.files("/data/dir2", "*.dat", full.names = TRUE)"
file <- matrix((data = file), ncol = 1000, nrow = 1200) #my real data
outmat[nr, nc] <- file[nr, nc]
}
}
}
答案 0 :(得分:3)
两种解决方案。
第一个填充更多内存,但效率更高,如果您有24个文件,我认为可行,如您所述。您一次阅读所有文件,然后根据dat
正确分组。类似的东西:
allContents<-do.call(cbind,lapply(dir2,readBin,n=nrows*ncol,size=4,"numeric")
res<-matrix(allContents[cbind(1:length(dat),c(dat+1))],nrows,ncols)
第二个可以处理稍多的文件(例如50-100)。它因此读取每个文件和子集的块。您必须打开与您获得的文件数量相同的连接数。例如:
outmat <- matrix(NA, nrows, ncols)
connections<-lapply(dir2,file,open="rb")
for (i in 1:ncols) {
values<-vapply(connections,readBin,what="numeric",n=nr,size=4,numeric(nr))
outmat[,i]<-values[cbind(seq_len(nrows),dat[,i]+1)]
}
+1
之后的dat
是因为,正如您在评论中所述,dat
中的值范围为0到23且R
索引为基于1的。