2016-09-29 2 views
2

これは非常に簡単な例です。R:foreachでデータフレームを分割する方法%dopar%

df = c("already ","miss you","haters","she's cool") 
df = data.frame(df) 

library(doParallel) 
cl = makeCluster(4) 
registerDoParallel(cl)  
foreach(i = df[1:4,1], .combine = rbind, .packages='tm') %dopar% classification(i) 
stopCluster(cl) 

実際には、n = 400000行のデータフレームを持っています。 1ステップで各クラスタのnrow/nclusterデータを送信する方法がわかりません。

ライブラリ(itertools)からisplitRowsを試してみましたが、成功しませんでした。

答えて

1

インデックスの操作を試みて、データのサブセットを作成してください。

foreach(i = nrow(df), .combine = rbind, .packages='tm') %dopar% { 
    tmp <- df[,i] 
    classification(tmp) 
} 

これは、各反復のdata.frameという新しい行を取ります。

また、foreachループの結果が新しい変数に書き込まれることに注意してください。このように、あなたはこのようにそれを割り当てる必要があります。ここAproach 1に提案されているように

res <- foreach(i = 1:10, .combine = c, ....) %dopar% { 
    # things you want to do 
    x <- someFancyFunction() 

    # the las value will be returned and combined by the .combine function 
    x 
} 
+0

提案ありがとうございました –

0

splitmclapplyの組み合わせを使用してみてください:https://www.r-bloggers.com/trying-to-reduce-the-memory-overhead-when-using-mclapply/

splitはあなたが要因によって定義されたグループにデータを分割するか、またはすることができますそれぞれの行で別々に操作したい場合は、1:nrow(df)を使用することができます。

+0

提案をいただきありがとうございます –

0

あなたのコメントの後に私のソリューションは:

n = 8 #number of cluster 
library(foreach) 
library(doParallel) 
cl = makeCluster(n) 
registerDoParallel(cl) 

z = nrow(df) 
y = floor(z/n) 
x = nrow(df)%%n 

ris = foreach(i = split(df[1:(z-x),],rep(1:n,each=y)), .combine = rbind, .packages='tm') %dopar% someFancyFunction(i) 

stopCluster(cl) 

#sequential 
if (x !=0) 
    ris = rbind(ris,someFancyFunction(df[(z-x+1):z,1])) 

注:「x」がゼロでない場合、機能分割が行(Z-(の残りの部分を入れているので 私は、最後にシーケンシャルesecutionを使用zx))を最初のクラスタに追加し、結果の順序を変更します。

関連する問題