2016-08-06 5 views
1

と仮定I割り当ていくつかの大規模な(例えば、非常に大きいかもしれないサイズNのベクトル)オブジェクトとは、その上に、m個の一連の動作を実行し関数型プログラミングの深層スタックはJVMでガベージコレクションを防止しますか?

fm(.. f3(f2(f1(vec)))) 

を各々がサイズNのコレクションを返すと

簡単にするために

はのは、各fは

def f5(vec: Vector[Int]) = { gc(); f6( vec.map(_+1)) } 

だから、非常に簡単であると仮定しない、VECもはや後続の各呼び出しが行われた時点で、将来の参照を持ってみましょう。 (f2は各呼び出しのためなどに入力され、後にF1のVECパラメータが使用されることはありません)

はしかし、ほとんどのJVMはスタックが巻き戻る(私の知る限り)までの参照をデクリメントしないので、へを必要私のプログラムではありませんNxMメモリを消費します。末尾再帰メソッドに同じ問題が存在しない

var vec:Vector[Int] = ... 

    for (f <- F) { 
    vec = f(vec) 
    gc() 
    } 

次のスタイルの比較によってのみ2xMが必要とされる(少ない他の実装で)?

これは単なる学問的なものではありません。大きなデータ型の問題の種類によっては、私たちのプログラムがRAMに完全に収まるようにNを選択することもあります。この場合、パイプライニングの1つのスタイルが別のスタイルよりも望ましいと懸念すべきですか?

+0

メモリを節約したい場合に 'view'を使わないのはなぜですか? –

+0

@VictorMoroz以上、イテレータでベクトルを置き換えてください。しかし、それは疑問のことではありません。長期保存されたスタック参照はGCを防止しますか? – user48956

答えて