2016-02-18 3 views
3

Основываясь на this post here, я попытался написать сценарий, видел здесь:R ошибка mclapply в цикле Еогеасп

library(parallel) 
library(doParallel) 

cl<-makeCluster(2,outfile='') 
registerDoParallel(cl) 

foreach(i=1:5, .packages='parallel') %dopar% { 
    system.time(mclapply(1:10, function(x){rnorm(1e5)},mc.cores=2)) 
} 

stopCluster(cl) 

Он работал intially, но теперь вырвет коды ошибок:

Error in unserialize(node$con) : error reading from connection 
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize 
Execution halted 
Error in unserialize(socklist[[n]]) : error reading from connection 
Error in unserialize(node$con) : error reading from connection 
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize 
Execution halted 

Любая идея, что происходит? Можно ли даже положить mclapply в цикл foreach?

Редактировать: Я также хочу сказать, что это на одной 8-ядерной машине, а не на кластере.

ответ

4

Я был в состоянии воспроизвести проблему на моей машине Linux, используя только пакет «параллельного» в R 3.2.3:

library(parallel) 
cl <- makeCluster(2) 
clusterEvalQ(cl, library(parallel)) 
fun <- function(i) { 
    mclapply(1:10, function(x) rnorm(1e5), mc.cores=2) 
    0 
} 
clusterApplyLB(cl, 1:5, fun) 

Из моих сеансов отладки, оказывается, что сокет соединения между мастером и рабочие могут быть повреждены, что может заставить рабочих умереть, когда они получают ошибку, пытаясь «неэтериализовать» данные из поврежденного соединения сокета.

Интересно, что я мог бы заставить этот пример работать, используя пакет «multicore» вместо «parallel». Я установил многоядерные 0,1-8 от RForge.net с помощью команды:

> install.packages('multicore',,'http://www.rforge.net/') 

Затем я загрузил «многоядерной» вместо «параллельно» на рабочих:

clusterEvalQ(cl, library(multicore)) 

Затем пример работал отлично. Вы можете изменить свой цикл foreach, чтобы использовать опцию .packages='multicore'.

Это насколько я отследил его. Я предполагаю, что дочерние процессы, раздвоенные «mclapply» в «parallel», каким-то образом искажают соединение сокета, которое они унаследовали, но я не смотрел код, чтобы убедиться, что эта теория правдоподобна.

Я думаю, ваш выбор:

  1. Не используйте «mclapply» в «doParallel» Еогеасп цикла
  2. Использование «mclapply» от «многоядерный 0,1-8» вместо «параллельно»
  3. Доклад этот вопрос к R-Core

Вам придется делать дополнительную работу, чтобы сообщить об этом R-Core, но, надеюсь, мой пример поможет.

+0

Это похоже на работу! Большое спасибо! – Plinth

Смежные вопросы