使用doparallel在R中的数据块上嵌套foreach

时间:2018-12-04 12:51:18

标签: r nested-loops doparallel

我正在尝试从20个大型数据集中解析JSON: 当我一遍又一遍地追加数据时,会花费很多时间。 而且,似乎时间逐行呈指数增长。 因此,我想到了将数据分成碎片,然后逐块处理。 内部循环可以正常工作,但我可以附加所有块。

此外,理想情况下,我希望将子集从内部foreach中分解成块,但是一旦这样做,我就会遇到另一个错误。

 chunk <- 1000
 n <- nrow(daily.db)
 chunkn<-ceiling(n/chunk)

db<-rbindlist(foreach(i = 1:length(chunkn)) %:%
        rbindlist(foreach(j=1:nrow(subset.db)) %dopar% {
            subset.db<-daily.db[((i-1)*1000+1):min(((i-1)*1000+1)+999,length(daily.db$filter))]
            json1<-jsonlite::fromJSON(txt =subset.db$filter[j])
            .db<-as.data.table(t(unlist(json1)))
            .db},fill=TRUE)
        ,fill = TRUE)

1 个答案:

答案 0 :(得分:0)

似乎更好的做法是为内循环创建一个函数:

parralelparsing<-function(subset.db) {
 rbindlist(foreach(j=1:nrow(subset.db)) %dopar% {
    json1<-jsonlite::fromJSON(txt =subset.db$filter[j])
    .db<-as.data.table(t(unlist(json1)))
    .db},fill=TRUE)
    }

然后使用循环,在一段代码上使用此功能:

chunk <- 10000
n <- nrow(daily.db)
chunkn<-ceiling(n/chunk)
db<-NULL

for (i in 1:chunkn) {
   .subset.db<-daily.db[((i-1)*chunk+1):min(((i-1)*chunk+1)+chunk-1,length(daily.db$filter))]
   .db<-parralelparsing(.subset.db)
   db<-rbindlist(list(db,.db),fill = T)
   }