r - 并行处理时出错: port cannot be open

标签 r parallel-processing rparallel

我在 Linux 集群中同时以批处理模式运行不同的 R 脚本,以估计不同数据集中的模型(当我在 Mac 中运行它时也会发生这种情况)。除了它们使用的数据集之外,这些脚本完全相同。当我这样做时,我收到以下消息。

Error in socketConnection("localhost", port = port, server = TRUE, blocking = TRUE, : 
cannot open the connection
Calls: makePSOCKcluster -> newPSOCKnode -> socketConnection
In addition: Warning message:
In socketConnection("localhost", port = port, server = TRUE, blocking = TRUE, :
port 11426 cannot be opened

这是一个可重现的示例。创建两个文件 tmp1.R 和 tmp2.R,以及 tmp.sh,其内容为:

文件 tmp1.R 和 tmp2.R 的内容:

library(dclone)
l <- list(1:100,1:100,1:100,1:100)
cl <- makePSOCKcluster(4)
parLapply(cl, X=l, fun=function(x) {Sys.sleep(2); sum(x); })
stopCluster(cl)

tmp.sh文件的内容:

#!/bin/sh
R CMD BATCH tmp1.R &
R CMD BATCH tmp2.R &

将执行列表中的第一个文件。第二个会出现上面的错误。有谁知道如何解决这个问题并且仍然自动运行所有脚本而无需任何手动干预?

PS:我已阅读所有其他类似问题,但没有一个具有可重现的示例或上述问题的答案。

最佳答案

您无需启动多个集群即可在多个数据集上运行相同的代码。只需将正确的数据发送到每个节点即可。

# make 4 distinct datasets
df1 <- mtcars[1:8,]
df2 <- mtcars[9:16,]
df3 <- mtcars[17:24,]
df4 <- mtcars[25:32,]

# make the cluster
cl <- makeCluster(4)

clusterApply(cl, list(df1, df2, df3, df4), function(df) {
    # do stuff with df
    # each node will use a different subset of data
    lm(mpg ~ disp + wt, df)
})

如果你希望数据在每个节点上持久化,以便后续分析:

clusterApply(cl, list(df1, df2, df3, df4), function(df) {
    assign("df", df, globalenv())
    NULL
})

这会在每个节点上创建一个 df 数据框,该数据框对于该节点来说是唯一的。

关于r - 并行处理时出错: port cannot be open,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40274178/

相关文章:

R:仅保留列中所有行中的前 3 (x) 个字符?

r - 计算R中矩阵列的曲线下面积

java - 使用java中的线程将串行程序转换为并行程序?

R bigmemory 总是使用后备文件?

c++ - 使用 Rcpp 时如何并行化 C++ 代码?

r - 拆分列的 R 代码是什么

完全删除 R 包 Rcpp

c - 带 MPI 的 Fox 算法

r - 有没有办法跟踪并行随机森林构建过程中的进度?