【发布时间】:2019-02-18 05:05:03
【问题描述】:
我有一个包含 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 函数?
【问题讨论】:
-
方法 4:
fread文件,rbind它们并继续使用data.table来提高性能(即allFilesBinded[, sum(rainfall), .(location.id, year)])怎么样?顺便说一句,因为1.11.0freadis parallelized. -
pbapply 包提供了简单的并行处理
-
像 pblapply(my.files, fread, cl = mycl) 一样简单
-
没有您的输入我无法测试,但我会选择:
library(data.table); do.call(rbind, lapply(list.files(pattern = "*.csv"), fread))[, sum(rainfall), .(location.id, year)] -
通过this guide了解有关 {foreach} 并行性的更多信息。
标签: r foreach parallel-processing doparallel