【发布时间】:2018-02-14 15:43:23
【问题描述】:
我正在尝试学习 foreach 来并行化我的任务
我的 for 循环如下所示:
# create an empty matrix to store results
mat <- matrix(-9999, nrow = unique(dat$mun), ncol = 2)
for(mun in unique(dat$mun)) {
dat <- read.csv(paste0("data",mun,".csv")
tot.dat <- sum(dat$x)
mat[mat[,1]== mun,2] <- tot.dat
}
unique(dat$mun) 的长度为 5563。
我想使用foreach 来并行化我的任务。
library(foreach)
library(doParallel)
# number of iterations
iters <- 5563
foreach(icount(iters)) %dopar% {
mun <- unique(dat$mun)[mun] # this is where I cannot figure out how to assing mun so that it read the data for mun
dat <- read.csv(paste0("data",mun,".csv")
tot.dat <- sum(dat$x)
mat[mat[,1]== mun,2] <- tot.dat
}
【问题讨论】:
-
你读过包小插曲吗?
foreach循环与for循环根本不同。最重要的是,它们不会产生副作用(至少在用于并行化时)。这意味着您不能从循环内部分配给循环外部的对象(例如mat)。无论如何,你可以简单地做foreach(mun = unique(dat$mun))。 -
另外,
read.csv很有可能是大部分时间。如果是这样,请考虑使用包 data.table 中的fread(“f”代表“fast”)。它可能会快很多数量级,并且您可能不需要并行化。 -
除了@Roland 建议使用
fread,我不相信这在任何情况下都是并行化的好选择,因为每个 for 循环都需要读取文件。并行执行这些任务很容易导致更多的磁盘寻道,从而导致操作速度变慢而不是更快。 -
好的。谢谢你的建议。我会阅读更多内容。
标签: r foreach parallel-foreach