Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R can';t打开并行集群的套接字_R_Parallel Processing - Fatal编程技术网

R can';t打开并行集群的套接字

R can';t打开并行集群的套接字,r,parallel-processing,R,Parallel Processing,我试图使用并行包,发现makeCluster无法完成。我在newPSOCKnode中跟踪了挂起到以下行: con <- socketConnection("localhost", port = port, server = TRUE, blocking = TRUE, open = "a+b", timeout = timeout) 所以除了一个不同的端口号之外,我认为一切都匹配 下一个技巧:我打开一个shell并运行netsh advfirewall firewall add

我试图使用
并行
包,发现
makeCluster
无法完成。我在
newPSOCKnode
中跟踪了挂起到以下行:

con <- socketConnection("localhost", port = port, server = TRUE, 
    blocking = TRUE, open = "a+b", timeout = timeout)
所以除了一个不同的端口号之外,我认为一切都匹配

下一个技巧:我打开一个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:0监听

但是运行
makePSOCKcluster
仍然挂起在同一位置

下一步: 我尝试从命令行运行
R
(通过cygwin bash),得到的错误消息是loadhistory(file)中的
error:没有可用的历史机制

执行暂停
,然后-C将我返回到R提示符。

测试1:明显的命令有效吗

library(parallel)    
cluster <- makePSOCKcluster("localhost")    
parSapply(cluster, 1:5, sqrt)
stopCluster(cluster)

您得到的是相同的消息吗?

您所描述的是PSOCK集群的典型问题:
makeCluster
挂起。由于许多原因,它可能会挂起,因为它必须创建所有进程,称为“worker”进程,这些进程将执行“集群”的实际工作,其中包括使用Rscript命令启动新的R会话,Rscript命令将执行
.slaveRSOCK
函数,它将创建一个回主机的套接字连接,然后执行
slaveLoop
函数,最终执行主机发送给它的任务。如果启动任何工作进程时出现任何错误(相信我:很多工作进程都可能出错),那么主进程将在执行
socketConnection
时挂起,等待工作进程连接到主进程,即使该工作进程可能已死亡或从未成功创建

对于许多失败场景,使用
outfile
参数是很好的,因为它经常揭示导致工作进程死亡的错误,从而导致主进程挂起。但如果没有显示任何信息,我将进入手动模式。在手动模式下,主机打印命令以启动每个工作程序,而不是执行命令本身。这是更多的工作,但它给了您完全的控制,如果需要,您甚至可以调试到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会话中,您可以在
.slaveRSOCK
函数上设置断点,然后执行它:

> debug(parallel:::.slaveRSOCK)
> parallel:::.slaveRSOCK()
现在您可以开始单步执行代码,可能会在
slaveLoop
makeSOCKmaster
函数上设置断点。在您的情况下,我假设它将挂起尝试创建套接字连接,在这种情况下,您的问题的标题将是合适的

有关此类问题的更多信息,请参阅

更新

现在这个问题已经解决了,我可以添加两个调试
makePSOCKcluster
问题的提示:

  • 检查.Rprofile中的任何内容是否仅在交互模式下工作
  • 在Windows上,使用Rterm命令而不是Rgui,以便更容易看到错误消息和使用
    outfile=''
    输出的结果

    • 好吧,我不觉得自己是个十足的白痴吗

      我回到了“软件调试的三个R”(重试、重新启动、重新加载),在重新启动我的系统并成功执行手动工作者启动后,我尝试创建一个带有
      manual=FALSE
      的集群,并立即获得成功

      编辑:我应该明确指出,将我的
      .Rprofile
      loadhistory()
      更改为
      if(interactive())loadhistory()
      对于成功使用
      集群
      功能至关重要

      我非常感谢里奇和史蒂夫提出的所有有益的意见和建议。我确实在“幕后”学到了很多东西,所以这次经历至少对我来说是非常积极的


      (因此,我不知道Windows操作系统的什么东西或中断的调用一直在妨碍我,但结局很好一切都很好)

      makeCluster(…,Rscript=)
      中指定
      Rscript.exe
      的适当路径阻止了我挂起该函数。“不过,那是很久以前的事了。”本巴恩斯试过——不行。我检查了一下;仍然正确生成了默认路径。主机挂起在那里,因为它正在等待刚刚开始连接回它的工作进程。真正的问题几乎肯定在工人身上。尝试使用outfile选项查看工作进程是否抛出错误,或者是否由于防火墙而挂起。查看对
      makeCluster
      的调用会很有帮助,因为这样可以控制工作进程的启动方式。@SteveWeston我试过了;没有错误(或者至少没有创建任何文件)生成延迟,尝试
      debug(socketConnection)
      会让我挂起R,直接从全局环境运行问题中的代码段也是如此。请参阅上面的my
      ls.str
      dump。顺便说一句,这里没有命令吗(无论是在cmd.exe中还是在cygwin bash窗口中,我都可以用来查看我的端口状态?@CarlWitthoft:在这里查找被阻止的端口。我将我的突袭添加到
      netstat
      netsh
      。我得到以下信息:`C:/Users/carl.witthoft/Documents/R/R-3.0.1/bin/x64/Rscript'-e'parallel::::.slaveRSOCK()'MASTER=localhost PORT=11017 OUT=mylog.txt TIMEOUT=2592000 METHODS=TRUE XDR=TRUE.External2中的错误(C_loadhistory,文件):“loadhistory”只能在Rgui和Rterm调用中使用:loadhistory执行已暂停。我希望这意味着我需要修改.Rprofile以避免loadhistory调用。我会继续下去。好的,从
      中删除
      loadhistory
      。Rprofile
      可以避免暂停。但是,bash终端和Rgui都不会返回。我注意感谢你的帮助,如果我能解决的话
      > 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 --vanilla --args MASTER=localhost PORT=10187 OUT=log.txt TIMEOUT=2592000 METHODS=TRUE XDR=TRUE
      
      > debug(parallel:::.slaveRSOCK)
      > parallel:::.slaveRSOCK()