Scala 流迭代和内存管理
Scala stream iterate and memory management
我有这个代码:
val res = Stream // launch the real computation, which alternates E and M steps, updating the computation state
.iterate(initCompState)(Base.emIteration)
.take(nIteration)
.last
想法是提供一个初始状态 initCompState
,一个从前一个状态生成新状态的函数,运行 这个用于 nIterations
并得到最终结果。
我对中间状态不感兴趣,希望它们在不需要时尽快被垃圾回收。根据我在网上阅读的内容,Stream
在递归定义时保留值,但这里不是这种情况。
我的实现是否正确?initCompState
和 res
之间的中间状态是否会在计算流中的下一个状态后立即被垃圾收集?
Stream
是 IterableAgain
,这意味着它将保留您迭代的所有元素,以防您再次看到它们。
Iterator
更适合您的情况,您可以扫描一次,因此,它会在您查看每个元素时立即丢弃它。但是它没有 last
,因此,您必须自己使用
之类的东西来实现它
iterator.foldLeft(Option.empty[Int])((_, n) => Some(n))
或者,只需递归地实现迭代:
@tailrec
def iterate(iters: Int, state: State = initCompState): State = if(iters == 0)
state
else
iterate(iters - 1, Base.emIteration(state))
val result = iterate(nIteration)
我有这个代码:
val res = Stream // launch the real computation, which alternates E and M steps, updating the computation state
.iterate(initCompState)(Base.emIteration)
.take(nIteration)
.last
想法是提供一个初始状态 initCompState
,一个从前一个状态生成新状态的函数,运行 这个用于 nIterations
并得到最终结果。
我对中间状态不感兴趣,希望它们在不需要时尽快被垃圾回收。根据我在网上阅读的内容,Stream
在递归定义时保留值,但这里不是这种情况。
我的实现是否正确?initCompState
和 res
之间的中间状态是否会在计算流中的下一个状态后立即被垃圾收集?
Stream
是 IterableAgain
,这意味着它将保留您迭代的所有元素,以防您再次看到它们。
Iterator
更适合您的情况,您可以扫描一次,因此,它会在您查看每个元素时立即丢弃它。但是它没有 last
,因此,您必须自己使用
iterator.foldLeft(Option.empty[Int])((_, n) => Some(n))
或者,只需递归地实现迭代:
@tailrec
def iterate(iters: Int, state: State = initCompState): State = if(iters == 0)
state
else
iterate(iters - 1, Base.emIteration(state))
val result = iterate(nIteration)