gpt4 book ai didi

scala - 从 Apache Spark 中的文件中联合一系列 RDD 的内存高效方式

转载 作者:行者123 更新时间:2023-12-04 15:57:11 25 4
gpt4 key购买 nike

我目前正在尝试在 UMBC Webbase Corpus(400 个文件中大约 30GB 的文本)上训练一组 Word2Vec 向量。

即使在 100 GB 以上的机器上,我也经常遇到内存不足的情况。我在应用程序本身中运行 Spark。我试图稍微调整一下,但我无法对超过 10 GB 的文本数据执行此操作。我的实现的明显瓶颈是先前计算的 RDD 的联合,即内存不足异常的来源。

也许您有经验提出比这更有效的内存实现:

 object SparkJobs {
val conf = new SparkConf()
.setAppName("TestApp")
.setMaster("local[*]")
.set("spark.executor.memory", "100g")
.set("spark.rdd.compress", "true")

val sc = new SparkContext(conf)


def trainBasedOnWebBaseFiles(path: String): Unit = {
val folder: File = new File(path)

val files: ParSeq[File] = folder.listFiles(new TxtFileFilter).toIndexedSeq.par


var i = 0;
val props = new Properties();
props.setProperty("annotators", "tokenize, ssplit");
props.setProperty("nthreads","2")
val pipeline = new StanfordCoreNLP(props);

//preprocess files parallel
val training_data_raw: ParSeq[RDD[Seq[String]]] = files.map(file => {
//preprocess line of file
println(file.getName() +"-" + file.getTotalSpace())
val rdd_lines: Iterator[Option[Seq[String]]] = for (line <- Source.fromFile(file,"utf-8").getLines) yield {
//performs some preprocessing like tokenization, stop word filtering etc.
processWebBaseLine(pipeline, line)
}
val filtered_rdd_lines = rdd_lines.filter(line => line.isDefined).map(line => line.get).toList
println(s"File $i done")
i = i + 1
sc.parallelize(filtered_rdd_lines).persist(StorageLevel.MEMORY_ONLY_SER)

})

val rdd_file = sc.union(training_data_raw.seq)

val starttime = System.currentTimeMillis()
println("Start Training")
val word2vec = new Word2Vec()

word2vec.setVectorSize(100)
val model: Word2VecModel = word2vec.fit(rdd_file)

println("Training time: " + (System.currentTimeMillis() - starttime))
ModelUtil.storeWord2VecModel(model, Config.WORD2VEC_MODEL_PATH)
}}
}

最佳答案

就像 Sarvesh 在评论中指出的那样,对于一台机器来说,这可能是太多的数据。使用更多的机器。我们通常看到需要 20-30 GB 的内存才能处理 1 GB 的文件。通过这个(非常粗略的)估计,对于 30 GB 的输入,您需要 600–800 GB 的内存。 (您可以通过加载部分数据来获得更准确的估计。)

作为更一般的评论,我建议您避免使用 rdd.unionsc.parallelize .改用 sc.textFile使用通配符将所有文件加载到单个 RDD 中。

关于scala - 从 Apache Spark 中的文件中联合一系列 RDD 的内存高效方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28343181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com