2014-09-16 10 views
7

Ho ancora un'altra domanda sulla raccolta dei rifiuti in Julia. Ecco un esempio minimo:Julia: la garbage collection all'interno delle funzioni funziona in modo diverso rispetto allo spazio globale

function OscarTheGrouch() 
    A = rand(Float32, 20000, 20000); 
    A = 0; 
    gc(); 
end 

Calling OscarTheGrouch() cause utilizzo RAM per aumentare di 1,6 GB. Chiamando lo gc() in seguito, il codice diminuirà di 1,6 GB.

Al contrario, semplicemente eseguendo il codice all'interno della funzione di scope globale, cioè, l'esecuzione

A = rand(Float32, 20000, 20000); 
A = 0; 
gc(); 

foglie RAM utilizzare invariato prima e dopo l'esecuzione.

My previous RAM use question risultato essere semplicemente dovuto al fatto che i risultati intermedi vengono memorizzati come ans. Tuttavia, chiamando dopo aver chiamato OscarTheGrouch() non viene visualizzato alcun risultato di array intermedio.

  • Quindi, dove si trova la memoria? La garbage collection all'interno delle funzioni si comporta in modo diverso (meno aggressivo?) Rispetto all'ambito globale?

Ho scostato il article on Julia functions, ma non ho visto nulla di ovvio.

+0

Molte cose sono diverse in ambito globale, di sicuro - il compilatore è in grado di dedurre meno. Non penso sia uno di loro. – IainDunning

+0

Pubblicato come un problema su https://github.com/JuliaLang/julia/issues/8393 –

risposta

6

posso riproduco il tuo comportamento

   _ 
    _  _ _(_)_  | A fresh approach to technical computing 
    (_)  | (_) (_) | Documentation: http://docs.julialang.org 
    _ _ _| |_ __ _ | Type "help()" for help. 
    | | | | | | |/ _` | | 
    | | |_| | | | (_| | | Version 0.3.0 (2014-08-20 20:43 UTC) 
_/ |\__'_|_|_|\__'_| | Official http://julialang.org/ release 
|__/     | x86_64-apple-darwin13.3.0 

julia> # Memory now about 64M 

julia> A = rand(Float32, 20000, 20000); 

julia> # Memory now about 1600M 

julia> A = 0 
0 
julia> gc() 

julia> # Memory now about 75M 

julia> function test1() 
     A = rand(Float32, 20000, 20000) 
     nothing 
     end 
test1 (generic function with 1 method) 

julia> test1() # Still about 78, although briefly higher 

julia> function test2() 
     A = rand(Float32, 20000, 20000) 
     A = 0 
     end 
test2 (generic function with 1 method) 

julia> test2() # Same behaviour 
0 

julia> function test3() 
      A = rand(Float32, 20000, 20000) 
      A = 0 
      gc() 
     end 
test3 (generic function with 1 method) 

julia> test3() # Now at 1600M 
+0

Penso che sia ciò che vede anche @DumpsterDoofus. Il problema è che una chiamata 'gc()' compilata in una funzione non sembra raccogliere array non raggiungibili allocati all'interno della stessa funzione, che posso riprodurre. Ancora più strano, sembra che la chiamata a 'gc()' in 'OscarTheGrouch() 'sia * impedendo * la raccolta! –

+0

Sì, come dice Matt B., penso ci sia un po 'di fraintendimento: sto ottenendo esattamente lo stesso risultato che faccio quando eseguo ciò che hai fatto (cioè, eseguendo il codice nello scope globale), e questo è perfettamente normale. Tuttavia, prova ad eseguire 'OscarTheGrouch' invece, e guarda cosa succede! Il mio punto è che quando il codice viene inserito all'interno di una funzione e la funzione viene eseguita, la garbage collection non funziona correttamente. – DumpsterDoofus

+2

Ah, vedo, ora l'ho ricreato, è sottile. Questo è appropriato per un problema Github su Julia, non una domanda SO. Non sono sicuro di chi mi ha downvoted, ma, non cool. – IainDunning