Я пытаюсь научиться 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))
. - person Roland   schedule 14.02.2018read.csv
занимает большую часть времени. Если это так, рассмотрите возможность использованияfread
из пакета data.table (f означает fast). Это может быть на много порядков быстрее, и вам, возможно, не понадобится распараллеливание. - person Roland   schedule 14.02.2018fread
, я не уверен, что это хороший кандидат на распараллеливание в любом случае, поскольку каждый цикл for требует чтения файла. Параллельное выполнение этих задач может очень легко привести к большему количеству обращений к диску и, таким образом, к замедлению, а не к ускорению работы. - person dww   schedule 14.02.2018