2015-12-29 2 views
4

Мне нужно запустить множество случайных лесных моделей, поэтому я хочу использовать doParallel на моем сервере с 8 ядрами, чтобы ускорить процесс.R doParallel foreach с обработкой ошибок для независимых работников

Тем не менее, некоторым моделям требуется намного больше времени, чем другие, или даже может вызвать ошибки. Я хотел бы запустить 8 моделей параллельно, и если модель выдает ошибку и/или пропускается, рабочие должны просто продолжать. Каждый результат модели сохраняется на жестком диске, поэтому я могу получить доступ и объединить их позже.

TryCatch 

или

.errorhandling="remove" 

не решить эту проблему. Я получаю

Error in unserialize(socklist[[n]]) : error reading from connection 

Пример кода: Я пробовал его с% do% и моделью 2-7 успешно. Тем не менее, в% dopar% Я получаю Показанную ошибку

foreach(model=1:8, .errorhandling="remove") %dopar% { 


     tryCatch({ 
      outl <- rf_perform(...) 
      saveRDS(outl,file=getwd() %+% "/temp/result_" %+% model %+% ".rds") 

    }, error = function(e) {print(e)}, finally = {}) 
    } 
+0

примечание: я запускаю новейший R 3.2.3 на Ubuntu 14.04 с 16 ядрами и 64G RAM – user670186

ответ

2

Я думаю, что я нашел проблему: если объекты, экспортируемые на кластеры слишком велики, либо R не может справиться с этим больше и/или есть тайм-аут

Мой экспорт объектов данных был 5 миллионов строк и 300 переменных, которые экспортированы в 16 кластеров.

cl <- makeCluster(16) 
registerDoParallel(cl) 
clusterExport(cl, "data") 

#data must not be too large 

Я уменьшил объект на более мелкие куски, и теперь он работает. Авторы могут захотеть упомянуть об этом в документации doParallel или бросить предупреждение, если объекты слишком большие.

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