2012-01-19 14 views
5

mio codice è simile: l'utilizzo della memoriaCome liberare memoria in Perl?

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 

Il mio programma va su e su.

Sembra Perl non memoria libera alla Linea A e Linea B.

Come posso fare manualmente Perl per liberare la memoria utilizzata %var e %var_new?

+4

Perché si assegna un hashref a un hash? – Quentin

+8

'usare rigorosamente; usare avvertenze; usa diagnostics' (quest'ultimo solo durante lo sviluppo) – Quentin

+0

Nonostante i bug nel codice che hai postato, non c'è ragione per il codice che hai postato per usare sempre più memoria. – ikegami

risposta

7

IIRC, una volta Perl è allocata memoria dal sistema operativo, che trattiene la memoria per la durata del processo. Ove possibile, Perl riutilizzerà la memoria che ha già assegnato piuttosto che chiedere di più al sistema operativo, ma non vedrai la memoria utilizzata da una diminuzione del processo.

+1

Quello che dici è vero in pratica, ma Perl * can * restituisce effettivamente memoria al sistema operativo. È un'altra domanda se sia desiderabile nel caso generale. – tsee

+0

Come rilasciare forzatamente la memoria non utilizzata sul sistema operativo? – Artem

+0

Sì. Una volta che la memoria un processo alloca la memoria dal sistema operativo, la manterrà fino alla fine della sua vita. Succede con qualsiasi lingua, non solo Perl. Detto questo, Perl è compilato in modo da usare mmap invece del proprio malloc, che può essere rilasciata a memoria fino a quando non viene completamente utilizzata. – Luchostein

1

Penso che utilizzando la funzione undef:

undef %var, %var_new; 

potrebbe fare il trucco. Questo è, naturalmente, se non avete bisogno di quello che c'è dentro quei hash più

+0

Impostare '% var' e'% var_new' su '{}' dovrebbe avere lo stesso effetto. –

+0

Non è così. Ispeziona con Devel :: Peek. – daxim

+5

@KeithThompson No, l'impostazione di '% var' e'% var_new' su '()' dovrebbe avere lo stesso effetto. – Stamm

13

Se avessi usato strict e warnings, avreste visto:

Riferimento trovato dove lista anche di dimensioni previsto

Le linee A e B non fanno ciò che pensate che facciano. Assegnano effettivamente come chiave la versione unificata di un riferimento a un hash vuoto e undef come valore. Anche se l'hash è quasi vuoto, la memoria non è contrassegnata come riutilizzabile perché non hai usato l'istruzione corretta per quello.

Prova utilizzando uno dei seguenti affermazioni sulle linee A e B:

undef %var; # this one 
%var =(); # or this one 
Problemi correlati