[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Освобождение памяти
efferson
Добрый день!

У меня следующая проблема: имеется цикл вида

Код

$oClass = new CSomeClass();
for( $iIterator = 0; $iIterator < SOME_BIG_VARIABLE; $iIterator++)
{
   echo "Используется памяти: " . memory_get_usage() . "\n";

   $aData = $oClass->someMethod();

   unset($aData);
}


Проблема в том, что при каждой итерации количество пожираемой скриптом памяти возрастает. Ясно, что проблема кроется в методе someMethod(), но рефакторить его нельзя в силу некоторых обстоятельств sad.gif

Возможно ли как-то заставить php освободить неиспользуемую им память, выделенную в ходе выполнения метода someMethod()?
efferson
Небольшая поправка - методу someMethod() передаётся параметр someMethod( $iIterator)
Sylex
че находится в someMethod() ?

_____________
Я думал я буду сеять добро, но у меня не получилось. Во-первых, мне помешали, во-вторых я сам отрекся от этой идеи.
Гостегчек
ЧТо там находится это тайна )
olgatcpip
Цитата
ЧТо там находится это тайна )

Ну тогда делай так:
Лезб в эту тайну и на ощуп коментируй разные строки и смотри помгло али нет. Если не помогло, бери другие строки, если помогло, радуйся и оставь так.


А если серьезно, у меня была такая проблема.
1 - Я пыталась понатыкать unset - не помогло
2 - оптимизировала код , ну там убрала лишние переменные, где-то использовала указатели....а где-то и вообще алгоритм меняла. Помогло но не достаточно.
3 - тогда я вышла из себя и сделала то, чего делать не стоит, но помогло.
У меня был цыкл, поэтому проще, на этом примере и объясню идею.
значит так. Память точно освобождается после закрытия скрипта.. Поэтому берем часть кода, первую итерацию выполняем. В конце вызываем этот же скрипт с параметром след цикла, НО не дожидаясь ответа завершаем работу.
Помогло. Вот только при перезагрузки сервера (так называемой жесткой) оно встанет колом.. но это совсем другая история....

_____________
Ласковое слово и кошке приятно... Плюсик в карму сойдет wink.gif
*smarty дока - новая любовь
Моё рукотворение ругайте, хвалите smile.gif
Веду маленький блог
в этом блоге публикую новые работы
WMR217126627282 wink.gif

Guest
16151
I++
Цитата
Возможно ли как-то заставить php освободить неиспользуемую им память, выделенную в ходе выполнения метода someMethod()?


Нет нельзя, вообще никак нельзя управлять памятью. Пых выделяет память блоками, например у нас есть переменная типа integer в которую запишем единицу, пых выделит сразу блок памяти, градации точно не скажу, давно тестил, но примерно от 4 до 64кб памяти сразу.

И она не будет освобождаться никогда, а чтобы она выросла нам нужно забить весь блок, тогда пых еще выделить памяти, если мы сделает unset переменных, то пых автоматом освободит блок, но и то не факт, иногда не освобождает, если у нас цикл который то забирает куча памяти, то полностью освобождает её. Причина тому проста, лучше отожрать побольше, чем получать накладные рассходы на экономии памяти и постоянно туда сюда выделять и освобождать блоки.

memory_get_usage() - показывает не настоящее значение потребление памяти, а внутреннее структурное пыха, сколько же реально выделено памяти, получить нельзя.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.