根据唯一标识符,我使用foreach
包和doParallel
子集(使用data.table
)1600万行和5列1300万次。我总共有32GB的RAM。
如果我将循环分解为小于250000次运行的迭代,则该过程可以正常工作。低于此阈值,处理时间或多或少与线性相关。
然而,当并行处理停止并且foreach
(我猜)将结果拼接在一起时,系统开始压缩内存。它专门压缩R的并行实例,并且可以在100万次迭代中增长到3GB。
我目前正以大约100000运行循环,每批大约需要12分钟。我以100万的速度一夜之间运行它,每批需要花费9个小时,压缩内存过程为3GB(即使我有大约14GB的开销)。 R本身的并行实例每个只占用大约60MB,这就是我认为这就是被压缩的东西。
压缩仅在R的并行实例处于非活动状态且循环组合结果的一段时间后发生。大约250000手,所花费的时间是36分钟,但是当压缩内存过程变得足够大时,大约500000开始花费大约2小时。
下图说明了处理器启动时循环运行以及迭代次数为100000的垃圾收集。在50000或更低的迭代中,根本没有压缩元素。
我已经读过您可以通过完全禁用页面文件来禁用此压缩过程但是如果我错误地估计我的峰值RAM使用率(100000次迭代的峰值是80%的内存使用率),这似乎有风险。有没有人知道一种方法来阻止内存压缩压缩R的并行实例?我真的认为这导致了经济放缓(从观察任务经理(总是)和实验),但我也可能是错的。
代码
start<-Sys.time()
cl<-makeCluster(detectCores())
registerDoParallel(cl)
for(k in 13:130) {
write.csv(k,paste("E:/police/Loop/",k,".csv",sep=""))
matrix.fsl<-matrix(rep("NA", 100000*128), nrow = 100000, ncol = 128)
a<-100000*k-99999
b<-100000*k
matrix.fsl<-foreach(i=a:b,.combine=rbind, .packages = "data.table") %dopar% {
temp<-FSL[Internal.CAS.Object.No==POLICE.FORENSICS.KEY[i,POLICE.FORENSICS.KEY]]
temp<-as.data.frame(temp)
#Labs
x1<-subset(temp,temp$Lab.Province==lab[1])
x2<-subset(temp,temp$Lab.Province==lab[2])
x3<-subset(temp,temp$Lab.Province==lab[3])
x4<-subset(temp,temp$Lab.Province==lab[4])
x5<-subset(temp,temp$Lab.Province==lab[5])
#exam type
for(j in 1:length(exam)) {
nam<-paste("y.",j,sep="")
temp2<-nrow(subset(temp,temp$Examination.Type==exam[j]))
assign(nam, temp2)
}
exam.temp<-c(y.1,y.2,y.3,y.4,y.5,y.6,y.7,y.8,y.9,y.10,y.11,y.12,y.13,y.14,y.15,y.16,
y.17,y.18,y.19,y.20,y.21,y.22,y.23,y.24,y.25,y.26,y.27,y.28,y.29,y.30,y.31,y.32,
y.33,y.34,y.35,y.36,y.37,y.38,y.39,y.40,y.41,y.42,y.43,y.44,y.45,y.46,y.47,y.48,
y.49,y.50,y.51,y.52,y.53,y.54,y.55,y.56,y.57,y.58,y.59,y.60,y.61,y.62,y.63,y.64,
y.65,y.66,y.67,y.68,y.69,y.70)
temp.police<-POLICE[INTERNAL_OBJECT_NUMBER==POLICE.FORENSICS.KEY[i,POLICE.FORENSICS.KEY]]
temp.police<-as.data.frame(temp.police)
#dssc
for(j in 1:length(dssc)) {
nam<-paste("y.",j,sep="")
temp2<-nrow(subset(temp.police,temp.police$DSSC_CODE_DESCRIPTION==dssc[j]))
assign(nam, temp2)
}
dssc.temp<-c(y.1,y.2,y.3,y.4,y.5,y.6,y.7,y.8,y.9,y.10,y.11)
#roh descr
for(j in 1:3) {
nam<-paste("y.",j,sep="")
temp2<-nrow(subset(temp.police,temp.police$CRIM_ROH_DESCR==crim[j]))
assign(nam, temp2)
}
crim.temp<-c(y.1,y.2,y.3)
#province
for(j in 1:length(prov)) {
nam<-paste("y.",j,sep="")
temp2<-nrow(subset(temp.police,temp.police$PROVINCE==prov[j]))
assign(nam, temp2)
}
prov.temp<-c(y.1,y.2,y.3,y.4,y.5,y.6,y.7,y.8,y.9)
#Year reported
for(j in 1:length(year.rep)) {
nam<-paste("y.",j,sep="")
temp2<-nrow(subset(temp.police,temp.police$YEAR_REPORTED==year.rep[j]))
assign(nam, temp2)
}
year.temp<-c(y.1,y.2,y.3,y.4,y.5,y.6,y.7,y.8,y.9,y.10,y.11,y.12,y.13)
#Month reported
for(j in 1:length(month.rep)) {
nam<-paste("y.",j,sep="")
temp2<-nrow(subset(temp.police,temp.police$MONTH_REPORTED==month.rep[j]))
assign(nam, temp2)
}
month.temp<-c(y.1,y.2,y.3,y.4,y.5,y.6,y.7,y.8,y.9,y.10,y.11,y.12)
#forensics
for(j in 1:length(forensics)) {
nam<-paste("y.",j,sep="")
temp2<-nrow(subset(temp.police,temp.police$Forensics==forensics[j]))
assign(nam, temp2)
}
forensics.temp<-c(y.1,y.2)
#court
for(j in 1:length(court)) {
nam<-paste("y.",j,sep="")
temp2<-nrow(subset(temp.police,temp.police$Court==court[j]))
assign(nam, temp2)
}
court.temp<-c(y.1,y.2)
y<-c(POLICE.FORENSICS.KEY[i],nrow(x1),nrow(x2),nrow(x3),nrow(x4),nrow(x5),
exam.temp, dssc.temp, crim.temp, prov.temp, year.temp, month.temp,
forensics.temp, court.temp)
y
}
write.csv(matrix.fsl,paste("E:/Police/Matrix/Matrix_",k,".csv",sep=""))
rm(matrix.fsl)
gc()
}
stopCluster(cl)
end<-Sys.time()