【问题标题】:Subset of data table when computing in parallel并行计算时的数据表子集
【发布时间】:2016-07-02 06:22:21
【问题描述】:

我正在尝试使用 data.table 运行并行计算。我有一个大数据集,我想独立并并行地处理每组主题。

令:DataP是一个大数据集:ID、x1、x2、x3、组

我的代码是:

# Data preparations
# I split an index (indx) because data split takes a lot of time with my data.
setkey(DataP ,SplitKey_f)
indx<-split(seq(nrow(DataP )),DataP $group)
l<-length(unique(DataP$group))

library(parallel)
library(doParallel)
library(foreach)
cl<-makeCluster(8)
registerDoParallel(cl)

foreach(i=1:l, .combine = rbind) %dopar% { 
  library(data.table)
  Psubset<-DataP [,indx[[i]]]
  # some transformations on the data
}
stopCluster(cl)

以上行不通,因为并行计算的foreach无法执行该行:

Psubset

但是,%do% 而不是 %dopar% 效果很好(但需要很多时间)。

如何解决问题 - 在并行循环中快速子设置 data.table?

【问题讨论】:

  • data.table 并不真正支持并行计算。它的引用机制在并行计算中并不能很好地发挥作用。您进行并行化的原因是您调用了一个非常耗时的函数within data.table,最好不使用data.table。但是,您似乎并非如此(“对数据进行一些转换”)。我怀疑您的实际问题是您并没有真正很好地利用 data.table 。 (我还注意到你没有分配foreach循环,这表明你没有很好地理解foreach。)
  • 您应该描述(包括一个可重现的示例)您实际尝试实现的目标,以便人们可以建议改进您的 data.table 代码,而无需并行化。
  • 为什么是Psubset&lt;-DataP [,indx[[i]]] 而不是Psubset&lt;-DataP[indx[[i]],]?您是在尝试拆分行而不是列,对吗?
  • 有一个新的split.data.table 方法即将推出,它比您当前使用的split 更快。缺乏可重复的示例会阻止许多人发布答案,请注意这一点。如果您对块的操作可以独立进行,您可以使用big.data.table,请点击 David 评论中的链接。

标签: r foreach split data.table


【解决方案1】:

尽管上面有@Roland 的评论,但我实际上发现这种方法非常有效,我已经使用它在 40 核 EC2 实例上并行处理数百万行的数百万计算。

我要做的第一件事是确保您的键设置为您将用作子集索引的列。你的索引是一个数组列表,这与我通常做的有点不同,但它仍然可以工作。

尝试以下方法:

out <- 
  foreach(i = indx, .packages = c('data.table'), .combine = data.table::rbind ) %dopar% {
    Psubset<-DataP[i,]
    # do some operations on Psubset
  }

或者如果由于某种原因combine 不起作用或需要额外的参数,您可以在事后进行。

out_list <- 
  foreach(i = indx, .packages = c('data.table') ) %dopar% {
    Psubset<-DataP[i,]
    # do some operations on Psubset
    )
  }
out <- rbindlist(outlist) #, fill=TRUE, etc.

如果这不起作用,我会查看索引,使其更像:

out <- 
  foreach(i = 1:max_indx, .packages = c('data.table'), .combine = data.table::rbind ) %dopar% {
    Psubset<-DataP[indx==i,]
    # do some operations on Psubset
  } 

但如果没有可重现的示例,很难知道哪一个效果最好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    相关资源
    最近更新 更多