远程服务器上用R的terra包运行并行代码遇连接读取错误
Terra包并行运行报错:unserialize(node$con) 连接读取错误
我在远程服务器上使用R语言的terra包运行简单代码,非并行模式下脚本正常,但开启2核并行时出现连接读取错误,排除内存问题(所用数据量很小)。
测试代码
library(terra) testfun <- function(i) { 2 * sqrt(i) } r <- rast(ncols=10, nrows=10) values(r) <- 1:ncell(r) x <- c(r, sqrt(r), r+50) x # 输出: # class : SpatRaster # dimensions : 10, 10, 3 (nrow, ncol, nlyr) # resolution : 36, 18 (x, y) # extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax) # coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) # source(s) : memory # names : lyr.1, lyr.1, lyr.1 # min values : 1, 1, 51 # max values : 100, 10, 150
非并行运行结果
test1 <- app(x, fun=testfun, cores =1) test1 # 输出: # class : SpatRaster # dimensions : 10, 10, 3 (nrow, ncol, nlyr) # resolution : 36, 18 (x, y) # extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax) # coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) # source(s) : memory # names : lyr.1, lyr.1, lyr.1 # min values : 2, 2.000000, 14.28286 # max values : 20, 6.324555, 24.49490
并行运行错误
test2 <- app(x, fun=testfun, cores =2) # 报错信息: # Error in unserialize(node$con) : error reading from connection
解决方法
- 显式注册并行集群:远程服务器环境下,手动初始化集群并导出函数,避免自动创建集群时的连接问题:
library(terra) library(parallel) # 创建2核集群 cl <- makeCluster(2) # 将自定义函数导出到子进程 clusterExport(cl, "testfun") # 传入集群对象运行并行计算 test2 <- app(x, fun=testfun, cores=cl) # 计算完成后关闭集群 stopCluster(cl)
检查服务器并行限制:部分远程服务器会限制用户的CPU进程数,或禁用fork模式(出于安全或资源管控),联系管理员确认是否存在这类限制。
升级Terra及依赖包:旧版本Terra的并行模块可能存在bug,更新到最新版本尝试解决:
install.packages("terra", dependencies = TRUE)
- 替换
cores参数为集群对象:直接传入已创建的集群对象,而非核数参数,减少自动集群初始化的潜在问题。
内容的提问来源于stack exchange,提问作者KEN
相关产品推荐
相关产品推荐

