5

Ho affrontato un problema strano di gestione della memoria in Perl. Sto lavorando in un'applicazione perl che utilizza hash-strutture piuttosto grandi. Sto assegnando l'ha rif con e indietro gli oggetti. Ma alla fine sembra che anche se sto deallocando l'oggetto e l'hash, l'utilizzo della memoria è rimasto lo stesso.Gestione della memoria in perl

Ecco un esempio del problema:

my $hash = {}; 
............. 
this ds gets populated with a lot of data ... 
....... 
{ 
     my $obj = new Class("data"=>$hash); 
....... 
....... 
...... 

} 

#even undefing the $hash 
undef $hash; 

# I can expect some improvement in Memory Utilization, but its not happening 

penso che sto facendo alcuni errori molto semplici. Qualcuno può suggerire?

risposta

3

In generale, la gestione della memoria Perl fa quello che devi fare, e non è necessario preoccuparsi a questo proposito. Ad esempio, qual è il danno di tenere una grande quantità di memoria allocata per il resto del programma? Probabilmente nessuno. Perl sarà rilasciarlo se il sistema operativo è in pericolo di esaurimento della memoria.

Supponiamo di avere un caso particolare, come uno script che viene eseguito costantemente in background, ma che occasionalmente deve eseguire un'attività che richiede molta memoria. Puoi risolvere questo problema separandolo in due script: background.pl e memory-intensive-task.pl. Il background.pl eseguirà memory-intensive-task.pl quando necessario. La memoria verrebbe liberata al completamento e all'uscita di questo programma.

12

Non è possibile restituire effettivamente la memoria al sistema operativo. Perl di solito lo manterrà per ridistribuirlo in seguito, anche se occasionalmente lo raccoglierà.

Vedi http://learn.perl.org/faq/perlfaq3.html#How-can-I-free-an-array-or-hash-so-my-program-shrinks-

e

http://clokwork.net/2012/02/12/memory-management-in-perl/

+0

Cosa succede in caso di oggetti? Quando un oggetto esce dall'ambito, viene chiamato il distruttore. Ciò conserverà ancora la memoria delle variabili lessicali definite nell'oggetto? – Kallol

+0

@Kallol, quel caso non è diverso da una variabile normale che non rientra nell'ambito, tranne che è possibile eseguire una pulizia personalizzata dell'oggetto. La memoria * sarà * libera per il Perl da usare per qualcos'altro, ma Perl non lo restituirà ancora al sistema. – dan1111

+0

che tipo di pulizia del cliente può essere fatto? – Kallol