|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Ivan Pechorin 2:5020/400 23 Jan 2003 18:52:07 To : Ivan Pechorin Subject : Re: perl tips and tricks for mod_perl ? --------------------------------------------------------------------------------
Ivan Pechorin wrote:
> Прочитал статью о (не)эффективном использовании
> памяти перлом при работе с большими строками и
> удивился:
> http://www.samag.ru/img/uploaded/samag14245-0.pdf
>
> Первая реакция была примерно такой: "Вроде простой
> язык, а чтобы нормально работать надо устраивать
> извращения почище чем в С"
>
> А теперь я ОЧЕHЬ хочу услышать Ваше мнение по
> поводу изложенных в этой статье проблем (при
> программировании под mod_perl)
>
Уточнение:
http://www.samag.ru/img/uploaded/samag14245-0.pdf
- это полный текст статьи
http://www.samag.ru/ru/articles/last/news_current.shtml?2002/12/20021226-5.html
- это лишь начало статьи
Hа всякий случай вставляю кусок из начала статьи, формулирующий основную
проблему:
В процессе тестирования и экспериментов я выявил общие проблемы,
возникающие в Perl при работе с большими данными, и нашел способы их
решения. После соответствующего переписывания, мой скрипт стал
потреблять адекватное количество памяти, а утечка памяти прекратилась.
Результаты своих исследований я предлагаю вашему вниманию. Итак, имеют
место 2 основные общие проблемы. ПРОБЛЕМА I Свободное употребление
Perl-средств для работы со строками - regexp'ов, substr, конкатенаций
типа $a.$b или "$a$b" - приводит к порождению лишних копий строки, т.е.
там, где по логике вещей алгоритму должно хватить 2 MB, будет потрачено
5 или 10 MB. ПРОБЛЕМА II Если не предпринять специальных усилий, то
после завершения Perl-функции рабочая память, израсходованная в этой
функции, HЕ БУДЕТ освобождена! (Ситуация совершенно отличная от
традиционной практики в языках без сборки мусора типа C++ или Pascal,
когда все рабочие переменные, созданные внутри функции, уничтожаются при
выходе из функции.) Это не так важно в обычном CGI-скрипте, исполняемом
внешним интерпретатором Perl. По завершении скрипта процесс будет
полностью уничтожен вместе со всей своей памятью. Hо в mod_perl или
FastCGI, или в независимых приложениях, или серверах на Perl это очень
существенно. Обратите внимание - описанная проблема HЕ ЕСТЬ истинная
утечка памяти. Встроенный сборщик мусора действительно обеспечивает
утилизацию ненужных переменных. Просто он делает это не совсем так, как
можно было бы ожидать. А именно: занятая память будет использована
повторно ПРИ СЛЕДУЮЩЕМ ВЫЗОВЕ той же самой функции, т.е. многократные
повторные вызовы функции не будут приводить к постепенному исчерпанию
RAM - явлению, которое традиционно называется утечкой памяти. Зато
многократные вызовы приведут к другому: со временем будет занят
наибольший объем памяти из всех, которые были нужны при различных
вариантах вызова этой функции. В моем случае, после того как мои
Perl-функции один раз обработали HTML-страницу размером 10 MB и
соответствующий процесс с mod_perl "съел" 100 MB, он так и продолжал
всегда занимать 100 MB, хотя все последующие обрабатываемые страницы
были небольшими. Внешне такое поведение очень похоже на утечку - объем
памяти, занятый процессом, никогда не уменьшается, но постепенно
медленно увеличивается - по мере того как этому процессу случайно
попадаются данные все большего размера.
--- ifmail v.2.15dev5
* Origin: Golden Telecom (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/8990d84745aa.html, оценка из 5, голосов 10
|