2016-07-07 10 views
4

Ich versuche, Speicher in Julia freizugeben, aber ohne Erfolg.Freigabe Speicher in Julia

function memuse() 
    return string(round(Int,parse(Int,readall(`ps -p 29563 -o rss=`))/1024),"M") 
end 


function test() 
    for i = 1:2 println("\ni=$i") 
    a = rand(10000,10000) 
    println("Created a $(memuse())") 
    a = 0 
    gc() 
    println("Release a $(memuse())\n") 

    b = rand(10000,10000) 
    println("Created b $(memuse())") 
    b = 0 
    gc() 
    println("Release b $(memuse())\n") 

    c = rand(10000,10000) 
    println("Created c $(memuse())") 
    c =0 
    gc() 
    println("Release c $(memuse())\n") 
    end 
end 

Ausgang:

i=1 
Created a 918M 
Release a 918M 

Created b 1681M 
Release b 1681M 

Created c 2444M 
Release c 2444M 


i=2 
Created a 3207M 
Release a 2444M 

Created b 3207M 
Release b 2444M 

Created c 3207M 
Release c 2444M 

Dieser Code muss nur 918M laufen, sondern nutzt 3207M.

Fragen: Warum gc() nicht ungenutzten Speicher freigibt? Es gibt eine Möglichkeit, den Garbage Collector zum Freigeben zu zwingen? Warum Garbage Collector nur bei der zweiten Iteration etwas Speicher freigibt?

Antwort

5

Von JeffBezanson in diesem GitHub Issue

Ja, das hat damit zu tun, wie Code generiert wird. Der Aufruf rand kommt auf rand!(Array(T, dims)), und das innere Array verbleibt auf dem "argument stack", da diese Slots im Allgemeinen wiederverwendet werden. Es wäre gut, diese Slots in einem Fall wie diesem auf Null zu setzen, aber es muss sehr sorgfältig gemacht werden, um zu vermeiden, dass viele unnötige Speicher hinzugefügt werden.

Sie können wie folgt umgehen:

@noinline function wrap() 
    rand(10000,10000) 
end 

function test() 
    for i = 1:2 println("\ni=$i") 
    a = wrap() 
    println("Created a $(memuse())") 
    a = 0 
    gc() 
    println("Release a $(memuse())\n") 

    b = wrap() 
    println("Created b $(memuse())") 
    b = 0 
    gc() 
    println("Release b $(memuse())\n") 

    c = wrap() 
    println("Created c $(memuse())") 
    c =0 
    gc() 
    println("Release c $(memuse())\n") 

    end 
end 

Notiere die @noinline so dass der Stapel gelöscht wird.

+0

wissen Sie, was verwendet werden kann, um Speicherverbrauch auf OSX auszudrucken, da der Code 'ps -p 29563 -o rss' nicht funktioniert – zwlayer