2012-01-19 19 views
5

Mój kod wygląda następująco: wykorzystanie pamięciJak zwolnić pamięć w Perlu?

my %var; 
my %var_new={}; 

while(1){ 
    while(my ($k,$v)=each %var){ 
      &a_sub($v); 
    } 
    %var={}; # A 
    map { $var{$_}=$var_new{$_}; } keys %var_new; 
    %var_new={}; # B 
} 

sub a_sub { #....} # will fill %var_new 

mój program idzie w górę iw górę.

Wydaje Perl nie wolnej pamięci na linii A i B.

Jak mogę ręcznie dokonać Perl, aby zwolnić pamięć używana %var i %var_new?

+4

Dlaczego przypisujesz hashref do skrótu? – Quentin

+8

'użyj ścisłego; używać ostrzeżeń; używaj diagnostyki "(ta ostatnia tylko w fazie rozwoju). – Quentin

+0

Pomimo błędów w zamieszczonym przez ciebie kodzie, nie ma powodu, aby opublikowany przez ciebie kod wykorzystywał coraz więcej pamięci. – ikegami

Odpowiedz

7

IIRC, gdy Perl przydzielił pamięć z systemu operacyjnego, to trzyma na tej pamięci dla życia procesu. O ile to możliwe, Perl będzie używał ponownie pamięci już przydzielonej, zamiast pytać systemu operacyjnego o więcej, ale nie zobaczysz pamięci używanej przez proces zmniejszania.

+1

To, co mówisz, jest prawdą w praktyce, ale Perl * może * faktycznie zwrócić pamięć do systemu operacyjnego. To kolejne pytanie, czy jest to pożądane w przypadku ogólnym. – tsee

+0

Jak na siłę uwolnić nieużywaną pamięć do systemu operacyjnego? – Artem

+0

Tak. Raz pamięć proces przydziela pamięć z systemu operacyjnego, zachowuje ją do końca życia. Zdarza się w każdym języku, nie tylko w Perlu. Powiedział, że Perl jest skompilowany tak, aby używać mmap zamiast własnego malloc, że pamięć może zostać zwolniona, o ile nie zostanie całkowicie wykorzystana. – Luchostein

1

Myślę, że przy użyciu undef funkcję:

undef %var, %var_new; 

może załatwić sprawę. To oczywiście jeśli nie potrzebujemy, co jest w środku tych skrótów już

+0

Ustawienie '% var' i'% var_new' na '{}' powinno mieć ten sam efekt. –

+0

Nie ma. Sprawdź w Devel :: Peek. – daxim

+5

@KeithThompson Nie, ustawienie '% var' i'% var_new' na '()' powinno mieć ten sam efekt. – Stamm

13

Jeśli użył strict i warnings, byś widział:

referencyjny znaleźć gdzie nawet wielkości lista spodziewać

Linie A i B nie robią tego, jak im się wydaje. W rzeczywistości przypisują one jako klucz usztywnioną wersję odniesienia do pustego skrótu, a undef jako jego wartość. Nawet jeśli wartość skrótu jest teraz prawie pusta, pamięć nie jest oznaczona jako możliwa do ponownego użycia, ponieważ nie wykorzystano do tego odpowiedniej instrukcji.

Spróbuj użyć jednego z poniższych stwierdzeń na liniach A i B:

undef %var; # this one 
%var =(); # or this one 
Powiązane problemy