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つのスタイルが別のスタイルよりも望ましいと懸念すべきですか?
メモリを節約したい場合に 'view'を使わないのはなぜですか? –
@VictorMoroz以上、イテレータでベクトルを置き換えてください。しかし、それは疑問のことではありません。長期保存されたスタック参照はGCを防止しますか? – user48956