Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Хронически не хватает памяти при работе на Денвере
 
 автор: Владимир55   (23.01.2010 в 13:34)   письмо автору
 
 

Очень и очень часто встречаюсь с проблемой нехватки памяти при выполнении циклических операций (работа на Денвере). И никак не могу понять, куда Денвер эту память девает.

Вот например:
    for ($i=0; $i < $n_str; $i++)
    {
        $tmp = $m_str[$i];
        $pos = strpos($tmp, "$");         
        $tmp = substr($tmp, 0, $pos) ;     
        $tmp = trim ($tmp) ;

        $filename = "../../" . $tmp . ".php" ;
        $dl_file = filesize($filename) ;

        $m_dlina[$i] = $dl_file ;

        $kod_control .= chr(13).chr(10) . $tmp . ".php $ " . $dl_file ;
    }

Здесь $n_str = 200000, а массив $m_str содержит строки длиною не более 40 знаков.
Массив $m_dlina имеет строки по 4 знака.

Таким образом, суммарно массивы имеют емкость не более 10 мбайт.
Переменная $kod_control может достичь размера 200.000х40=8мбайт.

В общем, памяти требуется немного.

Но на практике получается так, что, поработав некоторое время, скрипт останавливается с диагностическим сообщением, что ему не хватило 2Гб! И из Диспетчера можно наблюдать, как в процессе работы непрерывно и монотонно увеличивается размер потребляемой оперативной памяти.

Как такое возможно?

Каков механизм расходования памяти?

  Ответить  
 
 автор: Diplex   (23.01.2010 в 14:27)   письмо автору
 
   для: Владимир55   (23.01.2010 в 13:34)
 

Согласен, у меня сайт висит на денвере, жутко много кушает по сравнению с оригинальным апачем... Может нужно что-то в настройках поменять?

  Ответить  
 
 автор: @ndry   (23.01.2010 в 17:58)   письмо автору
 
   для: Diplex   (23.01.2010 в 14:27)
 

Лишний повод научиться ручками ставить вебсервер =). Если вам совсем лень и вы думаете, что умение настраивать вебсервер вам не пригодится (хотя я с этим не согласен), то попробуйте поработать с Zend Server CE, он по идее настроен на продакшн и должен работать получше.

  Ответить  
 
 автор: @ndry   (23.01.2010 в 18:03)   письмо автору
 
   для: Владимир55   (23.01.2010 в 13:34)
 

Попробуйте поэкспериментировать:
1. С расширениями PHP - убрать лишнее.
2. Запустить отладчик и посмотреть куда расходуется память
3. Попробовать очищать переменные после каждой итерации, упростить задачу сборщику мусора.
4. Сократить количество перезаписей переменных (не известно как там интерпретатор будет хранить эти переменные, а за то, как выглядит это для системы вообще молчу), пр.:

        $pos = strpos($m_str[$i], "$");          
        $tmp = trim (substr($m_str[$i], 0, $pos)) ;


Многие шаги не логичны, но вполне может помочь.

И на сам лишь запуск интерпретатора уходит от 6 до 9 мб памяти (если нет тяжёлых расширений).

  Ответить  
 
 автор: Владимир55   (23.01.2010 в 18:26)   письмо автору
 
   для: @ndry   (23.01.2010 в 18:03)
 

Настроить сервер мне не лень - знать бы только, что настраивать и как.

2. Запустить отладчик и посмотреть куда расходуется память
Я не умею этого делать. Что за отладчик и где его взять?

3. Попробовать очищать переменные после каждой итерации, упростить задачу сборщику мусора.
Что очищать в конкретном примере (вопрос в познавательных целях)?

4. Сократить количество перезаписей переменных (не известно как там интерпретатор будет хранить эти переменные, а за то, как выглядит это для системы вообще молчу), пр.:
        $pos = strpos($m_str[$i], "$");           
        $tmp = trim (substr($m_str[$i], 0, $pos)) ;
Что здесь не так по Вашему мнению? Что здесь можно сократить?

  Ответить  
 
 автор: @ndry   (23.01.2010 в 18:50)   письмо автору
 
   для: Владимир55   (23.01.2010 в 18:26)
 

> Что здесь не так по Вашему мнению? Что здесь можно сократить?
Это я уже сократил, может чуть-чуть упростить задачу интерпретатору, но не факт.

> Что очищать в конкретном примере (вопрос в познавательных целях)?
Всё, что вам не понадобится при следующей итерации, даже те-же пустые ячейки массивов и временные переменные, может обработчик мусора не справляется...

> Настроить сервер мне не лень - знать бы только, что настраивать и как.
Версия PHP какая? В каком режиме работает? Попробуйте самый банальный вариант: скачайте последние стабильные версии всего и установите руками, я с денвером почти не знаком, но думаю разработчики там добавляли настройки "от себя".

> Я не умею этого делать. Что за отладчик и где его взять?
У меня всё работает на Zend Server + Zend Studio for Eclipse, но вот ещё неплохой вариант - http://www.xdebug.org/.

  Ответить  
 
 автор: а-я   (23.01.2010 в 18:35)   письмо автору
 
   для: Владимир55   (23.01.2010 в 13:34)
 

смотри процессы апача.. у меня начинает с ~30МБ

один растет больше 100МБ жрет, через пару часов. =(

  Ответить  
 
 автор: Владимир55   (23.01.2010 в 19:01)   письмо автору
 
   для: а-я   (23.01.2010 в 18:35)
 

Не цель оптимизация приведенного кусочка кода. Это всего лишь пример.

Хотелось бы рассмотреть проблему шире.

Апач у меня начинается с 15 мб. Приведенные в первом посте размер памяти дает цифру 20 мб. И сам запуск 9 мб. Ну, пусть все это в сумме 50 мб. Пусть даже сотня.

Но это же не гигабайты!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования