我有一个文件夹,里面有 5000 个 csv 文件,每个文件属于一个位置,包含 1980 年到 2015 年的每日降雨量。文件的示例结构如下:
sample.file <- data.frame(location.id = rep(1001, times = 365 * 36),
year = rep(1980:2015, each = 365),
day = rep(1:365, times = 36),
rainfall = sample(1:100, replace = T, 365 * 36))
我想读取一个文件并计算每年的总降雨量并再次写入输出。有多种方法可以做到这一点:
for(i in seq_along(names.vec)){
name <- namees.vec[i]
dat <- fread(paste0(name,".csv"))
dat <- dat %>% dplyr::group_by(year) %>% dplyr::summarise(tot.rainfall = sum(rainfall))
fwrite(dat, paste0(name,".summary.csv"), row.names = F)
}
my.files <- list.files(pattern = "*.csv")
dat <- lapply(my.files, fread)
dat <- rbindlist(dat)
dat.summary <- dat %>% dplyr::group_by(location.id, year) %>%
dplyr::summarise(tot.rainfall = sum(rainfall))
我想使用foreach
. 如何使用do parallel
和for each
函数并行化上述任务?
以下是您的foreach request
.
require(foreach)
require(doSNOW)
cl <- makeCluster(10, # number of cores, don't use all cores your computer have
type="SOCK") # SOCK for Windows, FORK for linux
registerDoSNOW(cl)
clusterExport(cl, c("toto", "truc"), envir=environment()) # R object needed for each core
clusterEvalQ(cl, library(tcltk)) # libraries needed for each core
my.files <- list.files(pattern = "*.csv")
foreach(i=icount(my.files), .combine=rbind, inorder=FALSE) %dopar% {
# read csv file
# estimate total rain
# write output
}
stopCluster(cl)
但是当每次独立迭代的计算时间 (CPU) 高于其余操作时,并行化确实更好。在您的情况下,改进可能很低,因为每个内核都需要对读取和写入进行驱动器访问,并且由于写入是物理操作,因此最好按顺序进行(对硬件更安全,最终更高效)与多个文件的共享位置相比,每个文件在驱动器中都有独立的位置,需要索引等来区分您的操作系统 - 之前需要确认,这只是一个想法)。
HTH
巴斯蒂安
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句