Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Apache Spark MLLib-使用IDF-TF向量运行KMeans-Java堆空间_Scala_Apache Spark_Out Of Memory_K Means_Apache Spark Mllib - Fatal编程技术网

Scala Apache Spark MLLib-使用IDF-TF向量运行KMeans-Java堆空间

Scala Apache Spark MLLib-使用IDF-TF向量运行KMeans-Java堆空间,scala,apache-spark,out-of-memory,k-means,apache-spark-mllib,Scala,Apache Spark,Out Of Memory,K Means,Apache Spark Mllib,我正在尝试从一个(大型)文本文档集合(TF-IDF向量)在MLLib上运行KMeans。 文档通过Lucene英语分析器发送,稀疏向量由HashingTF.transform()函数创建。 无论我使用的并行程度如何(通过coalesce函数),KMeans.train总是返回下面的OutOfMemory异常。有没有想过如何解决这个问题 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at scala.r

我正在尝试从一个(大型)文本文档集合(TF-IDF向量)在MLLib上运行KMeans。 文档通过Lucene英语分析器发送,稀疏向量由HashingTF.transform()函数创建。 无论我使用的并行程度如何(通过coalesce函数),KMeans.train总是返回下面的OutOfMemory异常。有没有想过如何解决这个问题

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at scala.reflect.ManifestFactory$$anon$12.newArray(Manifest.scala:138)
at scala.reflect.ManifestFactory$$anon$12.newArray(Manifest.scala:136)
at breeze.linalg.Vector$class.toArray(Vector.scala:80)
at breeze.linalg.SparseVector.toArray(SparseVector.scala:48)
at breeze.linalg.Vector$class.toDenseVector(Vector.scala:75)
at breeze.linalg.SparseVector.toDenseVector(SparseVector.scala:48)
at breeze.linalg.Vector$class.toDenseVector$mcD$sp(Vector.scala:74)
at breeze.linalg.SparseVector.toDenseVector$mcD$sp(SparseVector.scala:48)
at org.apache.spark.mllib.clustering.BreezeVectorWithNorm.toDense(KMeans.scala:422)
at org.apache.spark.mllib.clustering.KMeans$$anonfun$initKMeansParallel$1.apply(KMeans.scala:285)
at org.apache.spark.mllib.clustering.KMeans$$anonfun$initKMeansParallel$1.apply(KMeans.scala:284)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
at org.apache.spark.mllib.clustering.KMeans.initKMeansParallel(KMeans.scala:284)
at org.apache.spark.mllib.clustering.KMeans.runBreeze(KMeans.scala:143)
at org.apache.spark.mllib.clustering.KMeans.run(KMeans.scala:126)
at org.apache.spark.mllib.clustering.KMeans$.train(KMeans.scala:338)
at org.apache.spark.mllib.clustering.KMeans$.train(KMeans.scala:348)

经过一些调查,发现这个问题与
新的HashingTF().transform(v)
方法有关。虽然使用散列技巧创建稀疏向量非常有用(特别是在特征数未知的情况下),但向量必须保持稀疏。HashingTF向量的默认大小为2^20。给定64位双精度,理论上,每个向量在转换为稠密向量时需要8MB,而不管我们可以应用什么降维

不幸的是,KMeans使用toDense方法(至少对于集群中心),因此导致OutOfMemory错误(假设k=1000)


您是否可以检查问题是否源于内存不足或向量试图创建过大的数组(例如接近Integer.MAX_值的数组)?这与newArray方法一致吗?它总是来自同一个newArray方法。使用HashingTF,向量非常大,但非常稀疏。我想知道为什么MLLib会试图将它们转换为densevector(这可能是个问题):看起来您的维度太大了。你以前试过降维吗?(虽然这可能需要更多的记忆,但我不确定。)我也注意到了同样的情况。initKMeansParallel和initRandom实现都会创建my Center向量的密集副本,从而导致内存不足错误。我将研究可能的降维,例如SVD。感谢Gabormind分享你为TF-IDF构建向量的方法?在KMeans中使用SparSevector时,我仍然遇到OutOfMemory问题<代码>调用o379.trainKMeansModel时出错:java.lang.OutOfMemoryError:org.apache.spark.mllib.linalg.SparseVector.toArray(Vectors.scala:523)org.apache.spark.mllib.clustering.KMeans$$anonfun$initRandom$1$$anonfun$apply$7.apply(KMeans.scala:267)
  private def initRandom(data: RDD[BreezeVectorWithNorm]) : Array[Array[BreezeVectorWithNorm]] = {
    val sample = data.takeSample(true, runs * k, new XORShiftRandom().nextInt()).toSeq
    Array.tabulate(runs)(r => sample.slice(r * k, (r + 1) * k).map { v =>
      new BreezeVectorWithNorm(v.vector.toDenseVector, v.norm)
    }.toArray)
  }