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 在递归定义时保留值,但这里不是这种情况。

我的实现是否正确?initCompStateres 之间的中间状态是否会在计算流中的下一个状态后立即被垃圾收集?

StreamIterableAgain,这意味着它将保留您迭代的所有元素,以防您再次看到它们。

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)