私は非常に多くの数のリストを持っており、それらは多くの数学操作を受けます。私は最終結果だけを気にします。この動作をシミュレートするには、以下のサンプルコードを参照してください。
object X {
def main(args:Array[String]) = {
val N = 10000000
val x = List(1 to N).flatten
println(x.slice(0,10))
Thread.sleep( 5000)
val y = x.map(_*5)
println(y.slice(0,10))
Thread.sleep( 5000)
val z = y.map( _+4)
println(z.slice(0,10))
Thread.sleep( 5000)
}
}
したがって、xは非常に大きなリストです。結果zだけが気になります。zを取得するには、最初にxを数学的に操作してyを取得する必要があります。次に、yを操作してzを取得します。(操作が非常に複雑なため、1つのステップでxからzに移動することはできません。これは単なる例です。)
したがって、この例を実行すると、おそらくx、y、zがすべてスコープ内にあり、それらがすべてメモリを占有しているために、メモリが不足しています。
だから私は次のことを試みます:
def main(args:Array[String]) = {
val N = 10000000
val z = {
val y = {
val x = List(1 to N).flatten
println(x.slice(0,10))
Thread.sleep( 5000)
x
}.map(_*5)
println(y.slice(0,10))
Thread.sleep( 5000)
y
}.map( _+4)
println(z.slice(0,10))
Thread.sleep(5000)
}
したがって、zのみがスコープに含まれます。したがって、おそらくxとyが作成され、スコープ外になるとガベージコレクションが行われます。しかし、これは何が起こるかではありません。代わりに、私は再びメモリを使い果たしました!
(注:私はjava -Xincgcを使用していますが、役に立ちません)
質問:1つの大きなリストに十分なメモリがある場合、valのみを使用して(つまり、可変変数やListBuffersを使用せずに)、おそらくスコープを使用してgcを強制することでそれを操作できますか?もしそうなら、どのように?ありがとう