2016-09-29 64 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行的数据帧。 我不知道如何在一个步骤中为每个群集发送nrow/ncluster数据,i =?

我尝试从库(itertools)isplitRows没有成功。

回答

1

您应该尝试使用索引来创建数据的子集。

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

这将需要每个迭代data.frame的新行。

此外,你应该注意到,foreach循环的结果将被写入一个新的变量。因此,你应该给它分配是这样的:

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

我您的意见后解决方案:

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])) 

注: 我用连续esecution底,因为如果“X”不是零,功能分割放行的其余部分(Z-( zx)),并更改结果的顺序。