Tengo una lista muy grande de números, que se someten a mucha manipulación matemática. Solo me importa el resultado final. Para simular este comportamiento, vea mi código de ejemplo a continuación:Problemas de alcance y memoria en Scala
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)
}
}
So x es una lista muy grande. Solo me importa el resultado z. Para obtener z, primero tengo que manipular matemáticamente x para obtener y. Luego manipulo y para obtener z. (No puedo pasar de x a z en un solo paso, porque las manipulaciones son bastante complicadas. Esto es solo un ejemplo.)
Así que cuando ejecuto este ejemplo, me quedo sin memoria, presumiblemente porque x, y y z son todo en el alcance y todos ocupan memoria.
Así que pruebe lo siguiente:
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)
}
Así que ahora sólo z es en su alcance. Así que, presumiblemente, se crean xyy y luego se recolectan los desechos cuando salen del alcance. Pero esto no es lo que sucede. En cambio, ¡nuevamente me quedo sin memoria!
(Nota: Estoy usando Java -Xincgc, pero no ayuda)
. Pregunta: Cuando tengo una memoria adecuada por sólo 1 lista grande, ¿hay algún modo manipularlo utilizando sólo de val (es decir, sin mutables vars o ListBuffers), ¿tal vez usar scoping para forzar gc? Si es así, cómo ? Gracias
Siempre se necesita memoria para dos listas. Por curiosidad, ¿has configurado tu montón de Java? Considerado 'Array's? –
Es cierto, siempre necesitaré memoria para 2 Listas, que tengo. Pero no debería necesitar memoria para 3 listas, que no tengo. ¿Estás de acuerdo? En cualquier caso, dado que xey están fuera del alcance, ¿por qué no se recogen basura una vez que la máquina virtual se da cuenta de que tiene poca memoria y las variables no están dentro del alcance? –