在我的(大型(服务器(具有255GB RAM的Windows(上,我的optimalparallel skript内存不足,然后用Error in serialize(data, node$con) : error writing to connection
崩溃。虽然我可以理解数据是否巨大,每个节点都会分配数据,但事实并非如此。
数据并不庞大(大约有200万行(,需要加载600MB的RAM。由于数据集稍小,该程序运行良好。我感谢任何帮助!
这是数据集:数据
这是我的脚本:
library(data.table)
sampler <- function(par,veh_id,routt,ccloops){
veh_id[,multi:=par]
routt[veh_id,par:=multi,on=.(vehicle_id)]
sumrout <- routt[,sum(par),.(edge_id,Ndets)]
sumdet <- routt[,.(Nmodel=sum(par)),.(edge_id,Ndets)]
routt[,par:=NULL]
geh_inside_cc <- sumdet[Ndets>0 & edge_id %in% ccloops$edge_id,mean(sqrt(2*(Ndets-Nmodel)^2/(Ndets+Nmodel)))]
geh_outside_cc <- sumdet[Ndets>0 & !(edge_id %in% ccloops$edge_id),mean(sqrt(2*(Ndets-Nmodel)^2/(Ndets+Nmodel)))]
# weight geh_inside_cc a bit higher
return(2*geh_inside_cc+geh_outside_cc)
}
routt <- fread("routt.csv")
veh_id <- fread("veh_id.csv")
ccloops <- fread("ccloops.csv")
library(optimParallel)
cl0 <- makeCluster(5) # set the number of processor cores
# registerDoParallel(cl <- makeCluster(2))
setDefaultCluster(cl=cl0) # set 'cl' as default cluster
clusterEvalQ(cl0, library("data.table"))
opt <- optimParallel(par = rep(1,nrow(veh_id)),veh_id=veh_id,routt=routt, ccloops=ccloops,fn = sampler,lower = 0, upper = 10000,
parallel=list(loginfo=TRUE, cl=cl0), control = list(maxit = 5))
stopCluster(cl0)
R版本:4.1optiPallel版本:1.0-2
所以我用一个伪数据测试了您的案例。首先,我必须在parallel
参数中添加forward
参数(getOption("optimParallel.forward")
对我来说是NULL
(。
在多会话处理下,您通常必须执行以下附加步骤:创建PSOCK集群,根据需要注册集群,在集群工作程序上加载必要的包,将必要的数据和功能导出到集群工作程序的全局环境。因此,数据是在所有会话和所有计算要求(RAM也是(中克隆/复制的。当我们计算每个会话(集群(的可用内存时,可能小于40GB(减去主会话(。
此外,数据集的大小并不是算法所消耗的全部RAM。例如,lm
线性回归可能需要比数据集大小多x10的内存。算法的复杂性通常随着变量(此处为参数(的数量呈指数级增长,因此这可能是另一个问题。