R: загрузка нескольких RData с помощью mclapply не работает - PullRequest
1 голос
/ 13 июля 2020

Я хотел загрузить несколько RData в одной команде, как объясняет Johua , используя

> lapply(c(a_data, b_data, c_data, d_data), load, .GlobalEnv)
[[1]]
[1] "nRTC_Data"

[[2]]
[1] "RTA_Data"

[[3]]
[1] "RTC_Data"

[[4]]
[1] "RTA_Data"

> rm(a_data, b_data, c_data, d_data); ls()
 [1] "nRTC_Data"       "RTA_Data"           "RTAC_data"     "RTC_Data"    
      

Однако, поскольку мои RData большие, и я не нашел улучшения времени между lappy() и несколько load(), я решил использовать многоядерный подход, например:

library(parallel)
mclapply(c(a_data, b_data, c_data, d_data),load,.GlobalEnv, mc.cores = parallel::detectCores())

Хотя это значительно улучшило время загрузки, также возвращает список

   [[1]]
    [1] "nRTC_Data"
    
    [[2]]
    [1] "RTA_Data"
    
    [[3]]
    [1] "RTC_Data"
    
    [[4]]
    [1] "RTA_Data"

В моем рабочая область, ничего не найдено

> rm(a_data, b_data, c_data, d_data); ls()
character(0)

Я также пробовал заменить .GlobalEnv на environment(), но все равно не получилось.

Кто-нибудь знает?

К вашему сведению, вы можете попробовать следующие команды:

> a = "aa";save(a, file = "aa.RData")
> b = "bb";save(b, file = "bb.RData")
> c = "cc";save(c, file = "cc.RData")
> d = "dd";save(d, file = "dd.RData")

> # lapply approach
> rm(list = ls())
> a = "aa.RData"; b = "bb.RData"; c = "cc.RData"; d = "dd.RData"
> lapply(c(a, b, c, d), load, .GlobalEnv); rm(a, b, c, d) 

> # mclapply approach
> rm(list = ls())
> a = "aa.RData"; b = "bb.RData"; c = "cc.RData"; d = "dd.RData"
> mclapply(c(a, b, c, d), load, .GlobalEnv, mc.cores = parallel::detectCores()); rm(a, b, c, d)

1 Ответ

2 голосов
/ 19 июля 2020

Я думаю, это потому, что при использовании mclapply базовый разветвление создает отдельные процессы. В приведенном ниже коде я использую mclapply с функцией myload, которая загружает файл Rdata и возвращает загруженный объект. Разница с вашей версией lapply заключается в том, что у вас есть данные в списке, возвращаемом mclapply

myload <- function(x){
  x <- load(x)
  get(x)
}

a = "aa.RData"; b = "bb.RData"; c = "cc.RData"; d = "dd.RData"

res <- mclapply(c(a, b, c, d), myload, mc.cores = parallel::detectCores()); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...