我正在尝试在大型数据集(~110k训练点)上训练SVM模型。这是一个代码示例,我使用parallelSVM包在我的4核Linux机器上对训练数据子集的训练步骤进行并行化。
numcore = 4
train.time = c()
for(i in 1:5)
{
cl = makeCluster(4)
registerDoParallel(cores=numCore)
getDoParWorkers()
dummy = train_train[1:10000*i,]
begin = Sys.time()
model.svm = parallelSVM(as.factor(target) ~ .,data =dummy,
numberCores=detectCores(),probability = T)
end = Sys.time() - begin
train.time = c(train.time,end)
stopCluster(cl)
registerDoSEQ()
}
这段代码的想法是通过逐渐增加虚拟训练集的大小来估计在整个数据集上训练模型所需的时间。在上面运行10,000和20,000个训练样本的代码之后,this是来自系统监视器的内存和交换历史使用统计信息。在4次运行for循环后,内存和交换使用率都约为95%,并且我收到以下错误:
summary.connection(连接)出错:连接无效
有关如何管理此问题的任何想法?有没有办法在使用stopCluster()函数后释放集群使用的内存?
请考虑到我是这个领域的绝对初学者。将非常感谢对所提出的解决方案的简短解释。谢谢。
答案 0 :(得分:1)
你的行
registerDoParallel(cores=numCore)
创建一个 new 群集,其节点数等于numCore
(您尚未说明)。这个集群永远不会被破坏,因此在循环的每次迭代中,您都会启动更多新的R进程。由于您已经使用cl = makeCluster(4)
创建了群集,因此您应该使用
registerDoParallel(cl)
代替。
(并在循环外移动makeCluster
,registerDoParallel
,stopCluster
和registerDoSEQ
来电。)