【问题标题】:R: how to split dataframe in foreach %dopar%R:如何在 foreach %dopar% 中拆分数据帧
【发布时间】:2017-02-07 11:26:25
【问题描述】:

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

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 = ?

我尝试使用 library(itertools) 中的 isplitRows 没有成功。

【问题讨论】:

    标签: r dataframe foreach split doparallel


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

    【讨论】:

      【解决方案2】:

      你的 cmets 之后我的解决方案:

      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)) 放在第一个簇中,并更改结果的顺序。

      【讨论】:

        【解决方案3】:

        尝试使用splitmclapply 的组合,如方法 1 中所述:https://www.r-bloggers.com/trying-to-reduce-the-memory-overhead-when-using-mclapply/

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

        【讨论】:

        • 感谢您的建议
        猜你喜欢
        • 1970-01-01
        • 2018-07-13
        • 1970-01-01
        • 2014-12-02
        • 1970-01-01
        • 2016-08-02
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        相关资源
        最近更新 更多