|
|
|
| Очень и очень часто встречаюсь с проблемой нехватки памяти при выполнении циклических операций (работа на Денвере). И никак не могу понять, куда Денвер эту память девает.
Вот например:
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Гб! И из Диспетчера можно наблюдать, как в процессе работы непрерывно и монотонно увеличивается размер потребляемой оперативной памяти.
Как такое возможно?
Каков механизм расходования памяти? | |
|
|
|
|
|
|
|
для: Владимир55
(23.01.2010 в 13:34)
| | Согласен, у меня сайт висит на денвере, жутко много кушает по сравнению с оригинальным апачем... Может нужно что-то в настройках поменять? | |
|
|
|
|
|
|
|
для: Diplex
(23.01.2010 в 14:27)
| | Лишний повод научиться ручками ставить вебсервер =). Если вам совсем лень и вы думаете, что умение настраивать вебсервер вам не пригодится (хотя я с этим не согласен), то попробуйте поработать с Zend Server CE, он по идее настроен на продакшн и должен работать получше. | |
|
|
|
|
|
|
|
для: Владимир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 мб памяти (если нет тяжёлых расширений). | |
|
|
|
|
|
|
|
для: @ndry
(23.01.2010 в 18:03)
| | Настроить сервер мне не лень - знать бы только, что настраивать и как.
2. Запустить отладчик и посмотреть куда расходуется память
Я не умею этого делать. Что за отладчик и где его взять?
3. Попробовать очищать переменные после каждой итерации, упростить задачу сборщику мусора.
Что очищать в конкретном примере (вопрос в познавательных целях)?
4. Сократить количество перезаписей переменных (не известно как там интерпретатор будет хранить эти переменные, а за то, как выглядит это для системы вообще молчу), пр.:
$pos = strpos($m_str[$i], "$");
$tmp = trim (substr($m_str[$i], 0, $pos)) ;
| Что здесь не так по Вашему мнению? Что здесь можно сократить? | |
|
|
|
|
|
|
|
для: Владимир55
(23.01.2010 в 18:26)
| | > Что здесь не так по Вашему мнению? Что здесь можно сократить?
Это я уже сократил, может чуть-чуть упростить задачу интерпретатору, но не факт.
> Что очищать в конкретном примере (вопрос в познавательных целях)?
Всё, что вам не понадобится при следующей итерации, даже те-же пустые ячейки массивов и временные переменные, может обработчик мусора не справляется...
> Настроить сервер мне не лень - знать бы только, что настраивать и как.
Версия PHP какая? В каком режиме работает? Попробуйте самый банальный вариант: скачайте последние стабильные версии всего и установите руками, я с денвером почти не знаком, но думаю разработчики там добавляли настройки "от себя".
> Я не умею этого делать. Что за отладчик и где его взять?
У меня всё работает на Zend Server + Zend Studio for Eclipse, но вот ещё неплохой вариант - http://www.xdebug.org/. | |
|
|
|
|
|
|
|
для: Владимир55
(23.01.2010 в 13:34)
| | смотри процессы апача.. у меня начинает с ~30МБ
один растет больше 100МБ жрет, через пару часов. =( | |
|
|
|
|
|
|
|
для: а-я
(23.01.2010 в 18:35)
| | Не цель оптимизация приведенного кусочка кода. Это всего лишь пример.
Хотелось бы рассмотреть проблему шире.
Апач у меня начинается с 15 мб. Приведенные в первом посте размер памяти дает цифру 20 мб. И сам запуск 9 мб. Ну, пусть все это в сумме 50 мб. Пусть даже сотня.
Но это же не гигабайты! | |
|
|
|