【发布时间】:2021-04-04 02:46:30
【问题描述】:
我希望在parallel process 中运行for loop。我使用for loop R 代码得到的结果符合我的口味,但会将其应用于非常huge data,因此执行时间很慢。
library(forecast)
library(dplyr)
arima_order_results = data.frame()
seed_out2 <- c(1, 16, 170, 178, 411, 630, 661, 1242, 1625, 1901, 1926, 1927, 1928, 2170, 2779, 3687, 4139, 4583, 4825, 4828, 4829, 4827, 5103, 5211, 5509, 5561, 5569, 5679, 6344, 6490, 6943, 6944, 6945, 6946, 6948, 6950, 6951, 6952)
for (my_seed in seed_out2){
set.seed(my_seed)
ar1 <- arima.sim(n = 100, model=list(ar = 0.8, order = c(1, 0, 0)), sd = 1)
ar2 <- auto.arima(ar1, ic = "aicc")
arr <- as.data.frame(t(ar2$coef))
if(substr(as.character(arr[1]), 1, 5) == "0.800") {
arr <- cbind(data.frame(seed=my_seed),arr)
print(arr)
arima_order_results = bind_rows(arima_order_results,arr)
# write.csv(my_seed, paste0(arr, ".csv"), row.names = FALSE)
} #else print("NOT AVAILABLE")
}
结果
# seed ar1
#1 170 0.8006368
# seed ar1
#1 411 0.8004152
# seed ar1
#1 630 0.8008459
# seed ar1
#1 661 0.8001553
# seed ar1 intercept
#1 1242 0.8000623 0.8474553
# seed ar1
#1 1625 0.8004982
# seed ar1
#1 1901 0.8007815
# seed ar1
#1 1927 0.8004587
# seed ar1
#1 2170 0.8003091
# seed ar1
#1 2779 0.8008643
#:
#:
#:
#seed ar1
#1 5679 0.800689
# seed ar1 intercept
#1 6344 0.80004 0.9800426
# seed ar1
#1 6490 0.8004093
# seed ar1
#1 6948 0.8006992
我想要什么
我需要一个并行进程,它可以同时用完我的四个处理器,以便job execution will be fast when I apply it to huge data` 得到相同的结果。
看看我的尝试
library(parallel)
library(foreach)
library(forecast)
library(dplyr)
library(doSNOW)
cl <- parallel::makeCluster(detectCores(), type = "SOCK")
doSNOW::registerDoSNOW(cl)
arima_order_results = data.frame()
seed_out2 <- c(1, 16, 170, 178, 411, 630, 661, 1242, 1625, 1901, 1926, 1927, 1928, 2170, 2779, 3687, 4139, 4583, 4825, 4828, 4829, 4827, 5103, 5211, 5509, 5561, 5569, 5679, 6344, 6490, 6943, 6944, 6945, 6946, 6948, 6950, 6951, 6952)
lst_out <- foreach::foreach(my_seed = seq_along(seed_out2), .packages = c("dplyr", "forecast") ) %dopar% {
set.seed(my_seed)
ar1 <- arima.sim(n = 100, model=list(ar = 0.8, order = c(1, 0, 0)), sd = 1)
ar2 <- auto.arima(ar1, ic = "aicc")
arr <- as.data.frame(t(ar2$coef))
if(substr(as.character(arr[1]), 1, 5) == "0.800") {
arr <- cbind(data.frame(seed=my_seed),arr)
print(arr)
arima_order_results = bind_rows(arima_order_results,arr)
# write.csv(my_seed, paste0(arr, ".csv"), row.names = FALSE)
}
}
查看我的试用结果
#>lst_out
#[[1]]
#NULL
#[[2]]
#NULL
#[[3]]
#NULL
#[[4]]
#NULL
#:
#:
#:
#[[36]]
#NULL
#[[37]]
#NULL
#[[38]]
#NULL
我在 windows 上操作。
伊迪丝
我希望修改@jay.sf 答案,使其包含在一个函数中,就像我在下面提供的函数一样。
FUN1 <- function(n, ar, sd, arr, R, FUN2){
FUN2 <- function(i, n, ar, sd, arr) {
set.seed(i)
ar1 <- arima.sim(n=n, model=list(ar=ar, order=c(1, 0, 0)), sd=sd)
ar2 <- auto.arima(ar1, ic="aicc")
(cf <- ar2$coef)
if (length(cf) == 0) {
rep(NA, 2)
}
else if (all(grepl(c("ar1|intercept"), names(cf))) & ## using `grepl`
substr(cf["ar1"], 1, 5) %in% "arr") {
c(cf, seed=i)
}
else {
rep(NA, 2)
}
}
seedv <- 1:R
library(parallel)
cl <- makeCluster(detectCores() - 1)
clusterExport(cl, c("FUN2"), envir=environment())
clusterEvalQ(cl, suppressPackageStartupMessages(library(forecast)))
res <- parLapply(cl, seedv, "FUN2")
res1 <- res[!sapply(res, anyNA)] ## filter out NAs
stopCluster(cl)
}
FUN1(n = 10, ar = 0.8, sd = 1, arr = 0.800, R = 1000, FUN2 = FUN2)
【问题讨论】:
-
可能你正在寻找
doRNGas here -
我需要的是并行处理,它会在
parallel processing的帮助下在我的MWE1中产生相同的结果。就是这样。 -
这两种情况是不同的,你给出的例子有两个
foreach函数,必须做identical,而我的例子是我有一个for loop函数,它工作得很好但缺乏执行速度,我要求做些什么来达到这个速度。 -
我的
MWE2只是尝试达到这样的速度,虽然速度达到了,但它没有打印任何结果 -
只是为了记录,你看过
sparkly包吗?您已表示您的目标是在应用于海量数据时更快地执行,这取决于您是否希望计算建立 Spark 连接的时间(每个会话一次),但原则上,Spark 旨在处理此类情况。
标签: r windows parallel-processing arima