gpt4 book ai didi

r - 无法为并行集群打开套接字

转载 作者:行者123 更新时间:2023-12-03 22:30:03 25 4
gpt4 key购买 nike

我正在尝试使用 parallel打包,发现makeCluster无法完成。我已将挂起追溯到 newPSOCKnode 中的以下行:

con <- socketConnection("localhost", port = port, server = TRUE, 
blocking = TRUE, open = "a+b", timeout = timeout)

该命令停止(授予默认超时是一个大值)。我怀疑这是由于我们的工作计算机上制定了一些“过于热心的 IT 规则”,但欢迎任何关于如何追踪(和修复)问题根源的建议。这是 Windows7-64,“企业”,R 3.0.1。

更多信息:在调试 session 中,我设置了 timeout < - 10 ,但它仍然挂起 - 好像 socketConnection被困在某个地方,它甚至无法检查超时值。

这是我与 Richie Cotton 数据相同的转储:
Browse[3]> ls.str()
arg : chr "parallel:::.slaveRSOCK()"
cmd : chr "\"C:/Users/carl.witthoft/Documents/R/R-3.0.1/bin/x64/Rscript\" -e \"parallel:::.slaveRSOCK()\" MASTER=localhost PORT=11017 OUT="| __truncated__
env : chr "MASTER=localhost PORT=11017 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE"
machine : chr "localhost"
manual : logi FALSE
master : chr "localhost"
methods : logi TRUE
options : <environment: 0x000000000ccac6a0>
outfile : chr "/dev/null"
port : int 11017
rank : int 1
renice : int NA
rscript : chr "\"C:/Users/carl.witthoft/Documents/R/R-3.0.1/bin/x64/Rscript\""
timeout : num 2592000
useXDR : logi TRUE

所以除了不同的端口号,我认为一切都匹配。

下一个技巧:我打开一个 shell 并运行 netsh advfirewall firewall add rule name="Open Port 11017" dir=in action=allow protocol=TCP localport=11017并得到了“OK”的回应。
我跑了 netstat -a -n并找到以下行:
TCP 0.0.0.0:11017 0.0.0.0:0 LISTENING
但是正在运行 makePSOCKcluster仍然卡在同一个地方。

下一个:
我试过运行 R从命令行(通过 cygwin bash),我得到的错误消息是 Error in loadhistory(file) : no history mechanism available
Execution halted
,之后 -C 将我返回到 R 提示。

最佳答案

您所描述的是 PSOCK 集群的经典问题:makeCluster挂起。它可能因多种原因而挂起,因为它必须创建所有进程,称为“工作”进程,这些进程将执行“集群”的实际工作,并且涉及使用 Rscript 命令启动新的 R session ,该命令将执行.slaveRSOCK函数,它将创建一个返回到 master 的套接字连接,然后执行 slaveLoop函数,它最终将执行 master 发送给它的任务。如果启动任何工作进程出现任何问题(相信我:很多都可能出错),主进程将在执行 socketConnection 时挂起。 ,等待工作人员连接到它,即使该工作人员可能已经死亡或从未成功创建。

对于许多故障场景,使用 outfile论点很好,因为它经常揭示导致工作进程死亡并因此导致主进程挂起的错误。但如果这没有任何显示,我会进入手动模式。在手动模式下,master 打印命令以启动每个 worker,而不是执行命令本身。这是更多的工作,但它可以让您完全控制,如果需要,您甚至可以调试到工作程序中。

下面是一个例子:

> library(parallel)
> cl <- makePSOCKcluster(1, manual=TRUE, outfile='log.txt')
Manually start worker on localhost with
'/usr/lib/R/bin/Rscript' -e 'parallel:::.slaveRSOCK()' MASTER=localhost
PORT=10187 OUT=log.txt TIMEOUT=2592000 METHODS=TRUE XDR=TRUE

此时,您的 R session 挂起,因为它正在执行 socketConnection ,正如你所描述的。现在你的工作是打开一个新的终端窗口(命令提示符或其他),然后粘贴该 Rscript 命令。一旦你执行了它, makePSOCKcluster应该回来,因为我们只要求了一名 worker 。当然,如果出现问题,它不会返回,但如果幸运的话,您会在终端窗口中收到一条错误消息,并且您将获得一个重要的线索,希望能够解决您的问题.如果您不那么幸运,Rscript 命令也会挂起,您将不得不深入研究。

要调试工作程序,您不需要执行显示的 Rscript 命令,因为您需要一个交互式 session 。相反,您可以使用以下命令启动 R session :
$ R --vanilla --args MASTER=localhost PORT=10187 OUT=log.txt TIMEOUT=2592000 METHODS=TRUE XDR=TRUE

在那个 R session 中,您可以在 .slaveRSOCK 上放置一个断点函数,然后执行它:
> debug(parallel:::.slaveRSOCK)
> parallel:::.slaveRSOCK()

现在您可以开始逐步执​​行代码,可能在 slaveLoop 上设置断点和 makeSOCKmaster职能。在您的情况下,我假设它会在尝试创建套接字连接时挂起,在这种情况下,您的问题标题将是合适的。

有关此类问题的更多信息,请参阅 my answer to a similar question.

更新

现在这个特殊问题已经解决,我可以添加两个调试技巧 makePSOCKcluster问题:
  • 检查您的 .Rprofile 中的任何内容是否仅适用于交互模式
  • 在 Windows 上,使用 Rterm 命令而不是 Rgui,这样您更有可能看到使用 outfile='' 的错误消息和输出。 .
  • 关于r - 无法为并行集群打开套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19248598/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com