Использование fread с foreach и doParallel в R

Я использовал fread с пакетами foreach и doParallel в R 3.2.0 в ubuntu 14.04. Следующий код работает нормально, хотя я не использовал registerDoParallel.

library(foreach)
library(doParallel)
library(data.table)

write.csv(iris,'test.csv',row.names=F)

cl<-makeCluster(4)

tmp<-foreach(i=1:10) %dopar% { t <- fread('test.csv') }

tmp<-rbindlist(tmp)

stopCluster(cl)

Однако при переходе на Windows 7 он больше не работает, с функцией registerDoParallel или без нее.

library(foreach)
library(doParallel)
#library(doSNOW)
library(data.table)

write.csv(iris,'test.csv',row.names=F)

cl<-makeCluster(4) 
registerDoParallel(cl)
#registerDoSNOW(cl)

tmp<-foreach(i=1:10) %dopar% { t <- fread('test.csv') }

tmp<-rbindlist(tmp)

stopCluster(cl)

Пакет doSNOW тоже не работает. Ниже сообщение об ошибке.

Error in { : task 1 failed - "could not find function "fread""

Есть ли у кого-нибудь подобный опыт?


Следующий вопрос касается вложенных foreach. Похоже, следующее не сработает.

cl<-makeCluster(4)
registerDoParallel(cl)
clusterEvalQ(cl , library(data.table))

tmp<-foreach(j=1:10) %dopar% {

            tmp1<-foreach(i=1:10) %dopar% {
                          t<-fread('test.csv',data.table=T)
                   }  
            rbindlist(tmp1)
      }
stopCluster(cl)

   


person Lamothy    schedule 16.06.2015    source источник
comment
обратите внимание, без registerDoParallel он не будет работать параллельно (вы получите предупреждение только в первый раз). Чтобы заставить fread работать, вам может потребоваться передать функции каждому кластеру через, что-то вроде clusterEvalQ(cl, library(data.table)) (непроверено)   -  person user20650    schedule 16.06.2015
comment
может представлять интерес stackoverflow.com/questions/17345271/ и stackoverflow.com/questions/27341210/   -  person user20650    schedule 16.06.2015
comment
Да ты прав. Спасибо, что указали на это. Я тоже получаю это предупреждение только впервые. Похоже, у меня такая же проблема как для ubuntu, так и для Windows.   -  person Lamothy    schedule 16.06.2015
comment
С registerDoParallel(cl) в ubuntu я получил такое же сообщение об ошибке Error in { : task 1 failed - "could not find function "fread"".   -  person Lamothy    schedule 16.06.2015
comment
@ user20650, спасибо за подсказки. foreach(i=1:10,.export='fread') может решить проблему.   -  person Lamothy    schedule 16.06.2015
comment
Это также работает на ubuntu clusterEvalQ(cl , library(data.table)) после регистрации серверной части.   -  person user20650    schedule 16.06.2015
comment
Прохладный. Если у меня более одной функции из разных библиотек, будет ли работать, если я использую clusterEvalQ для добавления всех функций в кластер?   -  person Lamothy    schedule 16.06.2015
comment
clusterEvalQ(cl , c(library(data.table), library(foreach))) но я бы не подумал, что это путь   -  person user20650    schedule 16.06.2015
comment
Вы снова правы, @ user20650. Оно работает!   -  person Lamothy    schedule 16.06.2015


Ответы (1)


Спасибо user20650 за ссылку в здесь. В основном это можно решить, установив .export='fread' в функции foreach.

Точнее, проблему решит следующее.

 tmp<-foreach(i=1:10,.export = 'fread') %dopar% { 
              t <- fread('test.csv',data.table=T) 
      }

На мой последующий вопрос о вложенных foreach, user20650 ответил в своих комментариях. А именно добавление clusterEvalQ(cl , c(library(data.table),library(foreach))). Следующий код, похоже, работает как в ubuntu, так и в Windows.

cl<-makeCluster(4)
registerDoParallel(cl)
clusterEvalQ(cl , c(library(data.table),library(foreach)))

tmp<-foreach(j=1:10) %dopar% {

     tmp1<-foreach(i=1:10) %dopar% { t <- fread('test.csv',data.table=T) }
     rbindlist(tmp1)
     }
person Lamothy    schedule 16.06.2015
comment
см. stackoverflow.com/questions/30927693/ о цикле double for - person user20650; 19.06.2015