R:使用 mclapply 加载多个 RData 不起作用
R: loading multiple RData with mclapply doesn't work
我想在一个命令中加载多个 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())
虽然这显着缩短了加载时间,但 returns 列表
[[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)
我也试过用environment()
替换.GlobalEnv
,但还是不行。
有人知道吗?
仅供参考,您可以尝试使用以下命令:
> 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)
我认为这是因为在使用 mclapply
时,底层分叉会创建单独的进程。在下面的代码中,我使用 mclapply
和 myload
函数来加载 Rdata 文件和 returns 加载的对象。 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());
我想在一个命令中加载多个 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())
虽然这显着缩短了加载时间,但 returns 列表
[[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)
我也试过用environment()
替换.GlobalEnv
,但还是不行。
有人知道吗?
仅供参考,您可以尝试使用以下命令:
> 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)
我认为这是因为在使用 mclapply
时,底层分叉会创建单独的进程。在下面的代码中,我使用 mclapply
和 myload
函数来加载 Rdata 文件和 returns 加载的对象。 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());