R:如何在foreach%dopar%中拆分数据帧

时间:2016-09-29 08:27:41

标签: r dataframe foreach split doparallel

这是一个非常简单的例子。

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但没有成功。

3 个答案:

答案 0 :(得分:2)

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

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 last value will be returned and combined by the .combine function
  x 
}

答案 1 :(得分:0)

尝试使用Aproach 1中建议的splitmclapply的组合:https://www.r-bloggers.com/trying-to-reduce-the-memory-overhead-when-using-mclapply/

split允许您将数据拆分为由因子定义的组,或者如果您想单独对每一行执行操作,则可以使用1:nrow(df)

答案 2 :(得分: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”不为零,则函数split将其余行(z-(z-x))放在第一个簇中,并更改结果的顺序。