gpt4 book ai didi

Scala 无限迭代器 OutOfMemory

转载 作者:行者123 更新时间:2023-12-05 00:36:03 25 4
gpt4 key购买 nike

我在玩 Scala 的惰性迭代器,但遇到了一个问题。我想要做的是读取一个大文件,进行转换,然后写出结果:

object FileProcessor {
def main(args: Array[String]) {
val inSource = Source.fromFile("in.txt")
val outSource = new PrintWriter("out.txt")

try {
// this "basic" lazy iterator works fine
// val iterator = inSource.getLines

// ...but this one, which incorporates my process method,
// throws OutOfMemoryExceptions
val iterator = process(inSource.getLines.toSeq).iterator

while(iterator.hasNext) outSource.println(iterator.next)

} finally {
inSource.close()
outSource.close()
}
}

// processing in this case just means upper-cases every line
private def process(contents: Seq[String]) = contents.map(_.toUpperCase)
}

所以我在大文件上收到 OutOfMemoryException 。我知道如果您保留对流头部的引用,您可能会与 Scala 的惰性流发生冲突。所以在这种情况下,我小心地将 process() 的结果转换为迭代器并丢弃它最初返回的 Seq。

有谁知道为什么这仍然会导致 O(n) 内存消耗?谢谢!

更新

针对 fge 和 huynhjl,似乎 Seq 可能是罪魁祸首,但我不知道为什么。例如,以下代码运行良好(我到处都在使用 Seq)。此代码不会产生 OutOfMemoryException:
object FileReader {
def main(args: Array[String]) {

val inSource = Source.fromFile("in.txt")
val outSource = new PrintWriter("out.txt")
try {
writeToFile(outSource, process(inSource.getLines.toSeq))
} finally {
inSource.close()
outSource.close()
}
}

@scala.annotation.tailrec
private def writeToFile(outSource: PrintWriter, contents: Seq[String]) {
if (! contents.isEmpty) {
outSource.println(contents.head)
writeToFile(outSource, contents.tail)
}
}

private def process(contents: Seq[String]) = contents.map(_.toUpperCase)

最佳答案

按照 fge 的提示,修改 process使用迭代器并删除 .toSeq . inSource.getLines已经是一个迭代器。

转换为 Seq将导致项目被记住。我认为它会将迭代器转换为 Stream并使所有项目都被记住。

编辑:好的,它更微妙。你做的相当于 Iterator.toSeq.iterator调用 iterator关于过程的结果。这可能会导致内存不足异常。

scala> Iterator.continually(1).toSeq.iterator.take(300*1024*1024).size
java.lang.OutOfMemoryError: Java heap space

这可能与此处报告的问题相同: https://issues.scala-lang.org/browse/SI-4835 .请注意我在错误末尾的评论,这是来自个人经验。

关于Scala 无限迭代器 OutOfMemory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8640646/

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