val
ブロック内で一度だけ使用される sへの参照を削除することにより、scala コンパイラはメモリ使用量を最適化しますか?
巨大なデータを集約して保持しているオブジェクトを想像してみてください。データまたはその派生物を複製すると、JVM/マシンのメモリの最大量をスクラッチする可能性があるサイズに達します。
最小限のコード例ですが、より長い一連のデータ変換を想像してください。
val huge: HugeObjectType
val derivative1 = huge.map(_.x)
val derivative2 = derivative1.groupBy(....)
コンパイラは、たとえば、計算huge
後にガベージ コレクションの対象としてマークしたままにしますか? derivative1
それとも、ラッピングブロックが終了するまで生き続けますか?
不変性は理論的には素晴らしいものです。個人的には中毒性があると思います。しかし、現在のオペレーティング システムでアイテムごとにストリーム処理できないビッグ データ オブジェクトに適合させるためには、JVM でのビッグ データ アプリケーションの場合、合理的なメモリ使用率と本質的にインピーダンスのミスマッチであると主張します。コンパイラがこのようなことを最適化しない限り、そうではありません..