【发布时间】:2016-10-16 22:07:40
【问题描述】:
我正在尝试在 Scala 中编写一个 Stream,但我不明白为什么它将一些中间对象保留在内存中(并最终耗尽内存)。
这是我的代码的简化版本:
val slols = {
def genLols (curr:Vector[Int]) :Stream[Int] = 0 #:: genLols(curr map (_ + 1))
genLols(List.fill(1000 * 1000)(0).toVector)
}
println(slols(1000))
这似乎将中介curr 留在内存中,我不明白为什么。
这是用迭代器编写的相同代码(内存消耗要好得多):
val ilols = new Iterator [Int] {
var curr = List.fill(1000 * 1000)(0).toVector
def hasNext = true
def next () :Int = { curr = curr map (_ + 1) ; 0 }
}
val silols = ilols.toStream
println(silols(1000))
编辑:我有兴趣将0s 保留在内存中,我的目标是不保留currs,因为它们对于采取计算步骤很有用(在我的简化示例中可能并不明显)。并且单独的 0s 不会导致内存不足错误(它们存储起来并不那么重)。
【问题讨论】:
标签: scala stream stack-overflow memoization