SSDM包socketConnection连接耗尽问题及集群并行配置咨询
解决SSDM并行运行时的Socket连接数不足问题
你的错误Error in socketConnection("localhost", port = port, server = TRUE, blocking = TRUE, : all connections are in use是因为R默认的最大同时打开连接数限制住了——R默认的maxConnections选项值通常是128,而你在stack_modelling里指定了cores=200,每个PSOCK并行节点都需要一个独立的socket连接,显然超过了默认上限。
下面是具体的解决方案和优化建议:
1. 先调整R的最大连接数(无需修改SSDM包)
在调用stack_modelling之前,先通过options()函数调高最大连接数,数值要比你设置的cores多一点(预留少量冗余):
# 设置最大连接数为210,适配200个核心 options(maxConnections = 210) # 可选:关闭所有闲置连接释放资源 closeAllConnections()
这个设置是会话级的,每次重启R都需要重新执行,如果你经常需要大并行作业,可以把这行代码添加到你的~/.Rprofile文件里,让R启动时自动加载。
2. 确认SSDM的并行逻辑适配
SSDM的stack_modelling函数是通过调用parallel::makePSOCKcluster来创建并行集群的,只要你提前设置好maxConnections,SSDM就能正常使用你指定的核心数,不需要修改包内部代码——它会自动复用你设置的全局连接限制。
3. 集群运行的额外优化建议
- 不要超配核心数:先通过
parallel::detectCores()确认当前节点的可用核心数,避免申请超过集群分配给你的资源,否则可能会被集群调度器限制,或者导致作业卡顿。 - 排查集群层面的限制:如果调整R的连接数后还是报错,可能是集群本身限制了每个用户的最大进程数或文件描述符数,这时候需要联系集群管理员调整配额,或者适当减少
cores的数值。 - 先小批量测试:可以先尝试用30个核心运行,确认调整
maxConnections后有效,再逐步增加到200,避免一次性占用过多资源导致意外问题。
修改后的完整代码示例
library(SSDM) setwd("/home/nikhail1") # 提前调整最大连接数并释放闲置连接 options(maxConnections = 210) closeAllConnections() # 加载环境变量和 occurrence 数据 Env <- load_var(path = getwd(), files = NULL, format = c(".grd", ".tif", ".asc", ".sdat", ".rst", ".nc", ".envi", ".bil", ".img"), categorical = "af_anthrome.asc", Norm = TRUE, tmp = TRUE, verbose = TRUE, GUI = FALSE) Occurrences <- load_occ(path = getwd(), Env, file = "Final_African_Bird_occurrence_rarefied_points.csv", Xcol = "decimallon", Ycol = "decimallat", Spcol = "species", GeoRes = FALSE, sep = ",", verbose = TRUE, GUI = FALSE) head(Occurrences) warnings() # 运行堆叠模型 SSDM <- stack_modelling(c("GLM", "GAM", "MARS", "GBM", "RF", "CTA", "MAXENT", "ANN", "SVM"), Occurrences, Env, Xcol = "decimallon", Ycol = "decimallat", Spcol = "species", rep = 1, name = "Stack", save = TRUE, path = getwd(), PA = NULL, cv = "holdout", cv.param = c(0.75, 1), thresh = 1001, axes.metric = "Pearson", uncertainty = TRUE, tmp = TRUE, ensemble.metric = c("AUC", "Kappa", "sensitivity", "specificity"), ensemble.thresh = c(0.75, 0.75, 0.75, 0.75), weight = TRUE, method = "bSSDM", metric = "SES", verbose = TRUE, GUI = FALSE, cores = 200) save.stack(SSDM, name = "Bird", path = getwd(), verbose = TRUE, GUI = FALSE)
内容的提问来源于stack exchange,提问作者Nikhail Arumoogum
相关产品推荐
相关产品推荐

