Ответ 1
Основная проблема заключается в том, что doParallel
выполняет attach
для каждого выполнения задачи для рабочих кластера PSOCK, чтобы добавить экспортированные переменные в путь поиска пакетов. Это решает различные проблемы, связанные с определением области охвата, но может значительно ухудшить производительность, особенно с задачами с малой продолжительностью и большими объемами экспортируемых данных. Этого не происходит в Linux и Mac OS X с вашим примером, поскольку они будут использовать mclapply
, а не clusterApplyLB
, но это произойдет на всех платформах, если вы явно зарегистрируете кластер PSOCK.
Я считаю, что я выяснил, как решить проблемы с заданием задачи по-другому, что не повредит производительности, и я работаю с Revolution Analytics, чтобы получить исправление в следующей версии doParallel
и doSNOW
, который также имеет ту же проблему.
Вы можете обойти эту проблему, используя разбиение задач:
ptime2 <- system.time({
chunks <- getDoParWorkers()
r <- foreach(n=idiv(trials, chunks=chunks), .combine='cbind') %dopar% {
y <- lapply(seq_len(n), function(i) {
ind <- sample(100, 100, replace=TRUE)
result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit))
coefficients(result1)
})
do.call('cbind', y)
}
})[3]
Это приводит только к одной задаче для каждого работника, поэтому каждый рабочий выполняется только attach
один раз, а не trials / 3
раз. Это также приводит к меньшему количеству операций с большим количеством сокетов, которые могут быть выполнены более эффективно для большинства систем, но в этом случае критическая проблема - attach
.