我想在R中运行多个偏最小二乘模型,并尝试利用并行包。但是,运行代码后,我可以在任务管理器中看到Rscript实例,除非关闭RStudio,否则它们不会终止。这些Rscipts是一个问题,因为如果我执行太多的迭代,它们将吞噬我计算机上的所有可用内存,并且基本上将其磨碎。
有人知道如何处理这些缠绵的Rscript(或可以指出我的代码中的错误,我是R的新手)?
下面是我的示例代码:
library(pls) #Package for PLS regression and MSC
library(parallel) #Allows for multi-core computations for cross-validation calculations
data(gasoline)
#Parallel Computing setup
num_cores <- 2
Made_Cluster = makeCluster(num_cores, type = "PSOCK")
num_iterations <- 10
for (i in 1:num_iterations) {
pls.options(parallel = makeCluster(num_cores, type = "PSOCK"))
gas1 <- plsr(octane ~ NIR, data = gasoline, validation = "LOO")
}
stopCluster(Made_Cluster)
我已经确认makeCluster和StopCluster命令在循环内的放置会产生不终止的相同Rscripts。即使num_cores <-1
,它也会发生library(pls) #Package for PLS regression and MSC
library(parallel) #Allows for multi-core computations for cross-validation calculations
data(gasoline)
#Parallel Computing setup
num_cores <- 1
num_iterations <- 10
for (i in 1:num_iterations) {
Made_Cluster = makeCluster(num_cores, type = "PSOCK")
pls.options(parallel = makeCluster(num_cores, type = "PSOCK"))
gas1 <- plsr(octane ~ NIR, data = gasoline, validation = "LOO")
stopCluster(Made_Cluster)
}
最后,终端显示有关未使用连接的奇怪消息。这些警告显示不同的语法,我无法始终如一地重现它们。这里有几个例子:
Warning messages:
1: In if (!is.vector(X) || is.object(X)) X <- as.list(X) :
closing unused connection 4 (<-mycomputer:port#)
2: In is.data.frame(x) :
closing unused connection 13 (<-mycomputer:port#)
3: In crossprod(q.a) :
closing unused connection 17 (<-mycomputer:port#)
这是我的sessioninfo()
Rstudio
$version
[1] ‘1.1.456’
R version 3.5.1 (2018-07-02)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
Matrix products: default
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] parallel stats graphics grDevices utils datasets methods base
other attached packages:
[1] pls_2.6-0
loaded via a namespace (and not attached):
[1] compiler_3.5.1 tools_3.5.1
答案 0 :(得分:0)
您只想创建一个“集群”对象(=一次调用makeCluster()
,而不是多个)。像这样:
cl <- makeCluster(num_cores, type = "PSOCK")
pls.options(parallel = cl)
[...]
for (i in 1:num_iterations) {
gas1 <- plsr(octane ~ NIR, data = gasoline, validation = "LOO")
}
stopCluster(cl)
观察结果的解释:如果您使用pls.options(parallel = makeCluster(...))
,最终将在该调用中创建另一个群集,由于您没有该群集的句柄,因此不会明确停止该群集。当R的垃圾收集器发现这样的“杂散”群集时,其底层连接最终将关闭-这就是为什么/当您收到这些警告时。如果将pls.options(parallel = makeCluster(...))
放入循环中,则每次迭代将创建一个杂散簇,并且还会收到更多警告。垃圾收集器在“随机”时间运行,这就是为什么这些警告的回溯显示为随机/不可再现的原因。