所以我试图建立一个SVM集合应用程序。
我遇到了预测方法的问题。
我将它基于nativeByVoting本机树集合使用。 SVM模型按顺序加载到驱动程序中的数组中。计算权重并将其存储到另一个名为modelWeights
的数组中 private def predictByVoting(features: Vector): Double = {
val votes = mutable.Map.empty[Int, Double]
models.view.zip(modelWeights).foreach { case (svmmodel, weight) =>
val prediction = svmmodel.predict(features).toInt
votes(prediction) = votes.getOrElse(prediction, 0.0) + weight
}
votes.maxBy(_._2)._1}
这是在RDD [LabeledPoints]测试中调用的。 490万行,11 725 480个功能。
val scoresAndLables= test.map{point=>
val prediction= predictByVoting(point.features)
(prediction,point.label)
}
当有许多模型时,执行程序内存不足。我的猜测是,这是由火花在每个点发送序列化模型引起的,最终导致OOM。
我尝试合并到更少的分区并重新分区以增加分区。
这是原生树合奏中的限制吗?它们如何在集合方法中防止这些内存不足错误? AM我以不好的方式存储模型和权重?
由于
答案 0 :(得分:2)
问题是模型和权重数组在每个点都被发送给执行者。导致OOM。
我通过广播模型和费率来解决这个问题,
val bModelsAndRates=sc.broadcast(models.view.zip(modelWeights))
这样模型就会被发送一次,从而限制网络IO。