R with parallel & pls - 如何在Windows中处理无法终止的R脚本进程

3
我想在R中运行多个偏最小二乘模型,并尝试利用parallel包提高效率。然而,运行我的代码后,我可以在任务管理器中看到一些Rscript实例,除非我关闭RStudio,否则它们不会终止。这些Rscipts是一个问题,因为如果我执行太多次迭代,它们会占用我电脑上的所有空闲内存,基本上使其停滞不前。
有谁知道如何处理这些挂起的Rscripts(或指出我的代码错误,我是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  

尝试在退出循环后添加rm(Made_Cluster),以从内存中删除该集群。在进行了一些测试后,stopCluster(Made_Cluster)并不能完全删除该集群。在我的测试中,在执行stopCluster之后,如果我将对象键入控制台,则仍然可以看到socket cluster with 2 nodes on host ‘localhost’ - Mako212
谢谢您的建议。我尝试了 rm(Made_cluster)。控制台输出了更多的警告信息:警告信息: 1: In name %in% noInlineSymbols : closing unused connection 6然而,在 Windows 上运行的 R 脚本仍未终止。 - Pulpy_T
我已经尝试了以下代码:library(parallel) num_cores <- 1 Made_Cluster = makeCluster(num_cores, type = "PSOCK") for (i in 1:100000) { parLapply(Made_Cluster, 2:4, function(exponent) 2^exponent) } stopCluster(Made_Cluster)它不会在内存中留下孤立的R脚本。 - Pulpy_T
1个回答

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(...))放入循环内部,则每次迭代都会创建一个流浪集群,您将会得到更多的警告。垃圾收集器在"随机"时间运行,这就是为什么这些警告的回溯看起来是随机/不可重现的原因。


感谢您敏锐的观察力,这确实解决了问题。 - Pulpy_T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接