Как освободить память в Perl? - PullRequest
5 голосов
/ 19 января 2012

Мой код выглядит так:

 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

Использование памяти моей программой увеличивается и увеличивается.

Кажется, Perl не освобождает память в строке A и строке B.

Как вручную настроить Perl для освобождения памяти %var и %var_new?

Ответы [ 3 ]

13 голосов
/ 19 января 2012

Если бы вы использовали strict и warnings, вы бы увидели:

Ссылка найдена там, где ожидается чётный список

Строки A и Bне делай то, что ты думаешь, они делают.Они фактически присваивают в качестве ключа строковую версию ссылки на пустой хеш, а undef в качестве его значения.Даже если хеш теперь почти пуст, память не помечается как повторно используемая, поскольку вы не использовали для этого надлежащий оператор.

Попробуйте использовать один из следующих операторов в строках A и B:

undef %var; # this one
%var = ();  # or this one
7 голосов
/ 19 января 2012

IIRC, как только Perl выделил память из операционной системы, он удерживает эту память на протяжении всего процесса. Там, где это возможно, Perl будет повторно использовать уже выделенную память, а не запрашивать у операционной системы больше, но вы не увидите уменьшения памяти, используемой процессом.

1 голос
/ 19 января 2012

Я думаю, что с помощью функции undef:

undef %var, %var_new;

может сделать трюк. Это, конечно, если вам больше не нужно то, что находится внутри этих хэшей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...