1

私はこのコードを持っている:Scalaのストリーム反復処理し、メモリ管理

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ストリームの次の状態が計算されるとすぐにガベージコレクションの間の中間状態ですか?

+2

むしろとき、だから、 'Iterator' – cchantep

答えて

0

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) 
+0

を使用します彼らはvalの代わりにdefを使用して、すべてのストリームをメモリに保存しないようにする必要があると言いました。これは、評価後にストリームを保持することを意味します。どちらの場合も、評価中に計算された値のセット全体が保持されますか? – vkubicki

+0

私は誰がそれを言ったのかわかりません。理由: – Dima

+0

[Scala doc](http://www.scala-lang.org/api/current/scala/collection/immutable/Stream.html)によると、 )「ストリーム」は何かが頭にかかっている間だけメモされます。 'def'を使うことはそれを避ける一つの方法です。実際の質問は次のようなものです: 'Stream.iterate()()'は、返された唯一のものが最終的な反復であれば、その頭を保持していますか? (これは、 'take(n).last'ではなく、直接索引付けすることができます)。 – jwvh