我有一个非常大的数字列表,经过大量的数学运算。我只关心最后的结果。要模拟这种行为,请参见下面的示例代码:
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。(我不能一步从 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 ?如果是这样,如何?谢谢