4

(v.1.8.7)と組み合わせて、ファイルをロードしてバインドしforeachたいと思います。並列化しておらず、警告を返しています...data.tableforeach

write.table(matrix(rnorm(5e6),nrow=5e5),"myFile.csv",quote=F,sep=",",row.names=F,col.names=T) 
library(data.table); 
#I use fread from data.table 1.8.7 (dev) for performance and useability
DT = fread("myFile.csv") 

ここで、ロードして行バインドするファイルがn個あるとすると、それを並列化したいと思います。(私はWindowsを使用しているので、フォークはありません)

allFiles = rep("myFile.csv",4) # you can change 3 to whatever

lapplyを使用する

f1 <- function(allFiles){
    DT <- lapply(allFiles, FUN=fread) #will load sequentially myFile.csv 3 times with fread
    DT <- rbindlist(DT);
    return(DT);
}

シングルスレッド

並列を使用(2.14.0としてのRの一部)

library(parallel)
f2 <- function(allFiles){
    mc <- detectCores(); #how many cores?
    cl <- makeCluster(mc); #build the cluster
    DT <- parLapply(cl,allFiles,fun=fread); #call fread on each core (well... using each core at least)
    stopCluster(cl);
    DT <- rbindlist(DT);
    return(DT);
}

ここでは両方のprocを使用します

今私はforeachを使いたい

library(foreach)
f3 <- function(allFiles){
    DT <- foreach(myFile=allFiles, .combine='rbind', .inorder=FALSE) %dopar% fread(myFile)
    return(DT);
}

ここに画像の説明を入力してください


foreachこれが私が仕事をすることができないことを確認するいくつかのベンチマークです

system.time(DT <- f1(allFiles));
utilisateur     systÞme      ÚcoulÚ
      34.61        0.14       34.84
system.time(DT <- f2(allFiles));
utilisateur     systÞme      ÚcoulÚ
       1.03        0.40       24.30    
system.time(DT <- f3(allFiles));
executing %dopar% sequentially: no parallel backend registered
utilisateur     systÞme      ÚcoulÚ
      35.05        0.22       35.38
4

1 に答える 1

2

これに答えてもらうためだけに:

警告メッセージに示されているように、に登録されている並列バックエンドはありませんforeachこのビネットを読んで、その方法を学びましょう。

ビネットからの簡単な例:

library(doParallel) 
cl <- makeCluster(3) 
registerDoParallel(cl) 
foreach(i=1:3) %dopar% sqrt(i) 
于 2013-02-01T18:33:48.103 に答える