2015-06-16 13 views
5

Ich verwendete fread mit foreach und doParallel Paket in R 3.2.0 in ubuntu 14.04. Der folgende Code funktioniert einwandfrei, obwohl ich registerDoParallel nicht verwendet habe.Mit fread mit foreach und doParallel in R

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) 

Beim Wechsel zu Windows 7 funktioniert es jedoch nicht mehr, mit oder ohne '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" -Paket funktioniert auch nicht. Unten ist die Fehlermeldung.

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

Hat jemand ähnliche Erfahrung?


Eine weitere Frage betrifft verschachtelte foreach. Es scheint, dass das Folgende nicht funktioniert.

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) 

+0

Hinweis ohne die 'registerDoParallel' wird es nicht parallel laufen (Sie erhalten nur eine Warnung beim ersten Mal). Um 'fread' zum Arbeiten zu bringen, müssen Sie eventuell die Funktionen an jeden Cluster weiterleiten, so etwas wie' clusterEvalQ (cl, library (data.table)) '(ungetestet) – user20650

+1

könnte von Interesse sein http://stackoverflow.com/ Fragen/17345271/r-how-does-a-foreach-loop-find-a-function-das-sollte-aufgerufen-werden und http://stackoverflow.com/questions/27341210/foreach-works-even-without- Export-Variable-und-Angabe-Paket-Abhängigkeit – user20650

+0

Ja, Sie haben Recht. Danke, dass du es aufgezeigt hast. Ich bekomme diese Warnung auch nur zum ersten Mal. Sieht aus, als hätte ich das gleiche Problem sowohl für Ubuntu als auch für Windows. – Lamothy

Antwort

2

Dank user20650 für die Referenz in here. Grundsätzlich kann es gelöst werden, indem .export='fread' in der foreach Funktion gesetzt wird.

Genauer gesagt, das Folgende wird das Problem beheben.

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

Um meine Follow-up Frage foreach verschachtelt in Bezug auf, user20650 antwortete er in seinen Kommentaren. Nämlich das Hinzufügen von clusterEvalQ(cl , c(library(data.table),library(foreach))). Der folgende Code scheint sowohl in Ubuntu als auch in Windows zu funktionieren.

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) 
    } 
+0

siehe http://stackoverflow.com/questions/30927693/how-can-i-parallelize-a-double-for-loop-in-r?answertab=votes#tab-top über die Double For-Schleife – user20650

Verwandte Themen