вложенный foreach с использованием doparallel на порциях данных в R - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь проанализировать JSON из огромного набора данных с 20: поскольку я добавляю данные снова и снова, процесс занимает много времени.И кажется, что времена увеличиваются экспоненциально на ряды.Поэтому я подумал о том, чтобы разделить данные на части и разбить их на части.Внутренний цикл работает нормально, но я могу добавлять через чанки.

Кроме того, в идеале я хотел бы вынести подмножество в чанки из внутреннего 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 голосов
/ 05 декабря 2018

Лучше всего создать функцию для внутреннего цикла:

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)
   }
...