Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Какая из конструкций вернет память для скрипта ?


Автор: nIkTo 21.8.2010, 16:42
какая из конструкций вернет память скрипту ?

Код

undef @array;
$#array = -1;
for ($i=0, $i<$#array,$i++) {
  $array[$i] = undef;
}
@array = ();


Интересует так же и для хэша.

И ещё подскажите как мониторить куда расходуется память. Похоже где-то текёт, а где не могу понять.

Автор: DurRandir 21.8.2010, 16:48
п.3 не эквивалентен остальным (догадайтесь, почему). п.1 - deprecated, см. perldoc. Из п.2 и п.4 я выбираю п.4.

По памяти. Перл не возвращает память обратно ОС. Т.е. если у вас в какой-то момент потребовалось 100мб - эти 100мб будут переиспользоваться потом, пока не потребуется больше (есть тонкости, конечно, но в общих чертах - это так), но отдать их ОС - нельзя. Поэтому признак утечки - если со временем у вас постоянный рост потребления памяти. Если на какую-то одну операцию её потребовалось много - это ещё не утечка.

Автор: Pfailed 21.8.2010, 18:06
Цитата(DurRandir @  21.8.2010,  16:48 Найти цитируемый пост)
п.1 - deprecated, см. perldoc.

В каком разделе perldoc можно об этом почитать?

Автор: Jimy 21.8.2010, 19:01
Следующие две команды эквивалентны:
@array = ();
$#array = -1;

Усечение массива не освобождает занимаемую им память. Чтобы вернуть память в пул памяти процесса, нужно использовать
undef (@array)
Вернуть память в системный пул, вероятно, не удасться, поскольку немногие операционные системы поддерживают это.

Так что правильный ответ: только вариант №1.

Автор: DurRandir 21.8.2010, 20:25
Да, я тут скорее всего ошибся. Ответ от Jimy точнее - только п.2 и п.4 эквивалентны.

Автор: KSURi 23.8.2010, 13:20
http://www.slideshare.net/andy.sh/theres-more-than-one-way-to-empty-it ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)