Ho una lista molto grande di numeri, che subiscono molta manipolazione matematica. Mi interessa solo il risultato finale. Per simulare questo comportamento, vedere il seguente codice di esempio:Scope e problemi di memoria in 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)
}
}
Quindi x è un elenco molto grande. Mi interessa solo il risultato z. Per ottenere z, prima devo manipolare matematicamente x per ottenere y. Quindi maneggio y per ottenere z. (Non posso andare da x a z in un solo passaggio, perché le manipolazioni sono piuttosto complicate.Questo è solo un esempio.)
Così quando eseguo questo esempio, esaurisco la memoria presumibilmente perché x, yez sono tutto in ambito e tutti occupano memoria.
quindi cerco il seguente:
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)
}
Così ora solo z è portata. Quindi presumibilmente x e y vengono creati e quindi i garbage collection quando escono dal campo di applicazione. Ma questo non è quello che succede. Invece, di nuovo a corto di memoria!
(Nota: io sto usando Java -Xincgc, ma non aiuta)
. Domanda: Quando ho memoria adeguata per solo 1 elenco di grandi dimensioni, posso in qualche modo manipolarla utilizzando solo di val (cioè non mutable vars o ListBuffers), forse usando l'ambito per forzare gc? Se é cosi, come ? Grazie
Avrete sempre bisogno di memoria per due elenchi. Per curiosità, hai impostato il tuo heap Java? Considerato 'Array's? –
Vero, avrò sempre bisogno di memoria per 2 elenchi, cosa che ho. Ma non dovrei avere bisogno di memoria per 3 liste, che non ho. Sei d'accordo? In ogni caso, dato che x e y escono dall'ambito di applicazione, perché non vengono raccolti dati inutili una volta che la VM realizza il suo cortocircuito sulla memoria e le variabili non sono nel campo di applicazione? –