首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Windows中处理不终止的Rscript进程

如何在Windows中处理不终止的Rscript进程
EN

Stack Overflow用户
提问于 2018-08-16 00:24:06
回答 1查看 782关注 0票数 3

我想在R中运行多个偏最小二乘模型,并试图利用并行软件包。但是,在运行代码之后,我可以在任务管理器中看到除非关闭RStudio否则不会终止的Rscript实例。这些枕木是个问题,因为如果我执行了太多的迭代,它们就会消耗掉我电脑上所有的空闲内存,然后基本上就会停止运转。

有人知道如何处理这些徘徊在我的代码中的Rscript(或者指出我的代码中的错误,我是R的新手)吗?

下面是我的示例代码:

代码语言:javascript
复制
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,也会发生这种情况。

代码语言:javascript
复制
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)
}

最后,终端显示关于未使用连接的奇怪消息。这些警告显示了不同的语法,我无法始终如一地再现它们。以下是几个例子:

代码语言:javascript
复制
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()

代码语言:javascript
复制
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  
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-17 06:46:52

您希望只创建一个“集群”对象(=对makeCluster()的一个调用,而不是多个调用)。类似于:

代码语言:javascript
复制
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(...))放在循环中,那么每次迭代都会创建一个偏离的集群,甚至会收到更多的警告。垃圾收集器在“随机”时间运行,这就是为什么这些警告的跟踪显示为随机/不可复制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51868082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档