0 / 0 / 0
Регистрация: 27.08.2013
Сообщений: 8
|
|
1 | |
Выявить утечку памяти23.08.2014, 21:44. Показов 6668. Ответов 19
Метки нет (Все метки)
Здравствуйте. Написал парсер с библиотекой для парсинга simple_html_dom. После длительного парсинга видно, что память переполняется. Можно ли как то узнать, в каком месте идет переполнение памяти ? Профайлер может
0
|
23.08.2014, 21:44 | |
Ответы с готовыми решениями:
19
Выделение памяти, проверка на утечку памяти Найти утечку памяти Проверка на утечку памяти Проверка на утечку памяти |
F́́́́́́́ŕ́́́́́́́é́́́ ́ak
259 / 223 / 109
Регистрация: 07.07.2014
Сообщений: 965
|
|
24.08.2014, 17:57 | 2 |
Пробовал ловить утечки памяти в большом проекте - дело совершенно неблагодарное.
Первое что я сделал - попробовал повтыкать везде memory_get_usage, - ничего толком не получилось. Потом я попробовал подключится через отладчик, - повыполнять скрипт пошагово, посмотреть где какие-то свойства на новой итерации забываются.. ничего не нашел - было слишком много начинки внутри фреймворка. Потом пробовал различные профайлеры - они в принципе ничего не дали, кроме красивой картинки.. Еще помню пробовал играться с версией PHP, накатывать различные патчи.. ничего особо не помогло.. =) Затем я вернулся к первому способу и таки нашел утечку памяти.. в PECL'овом расширении amqp для PHP.. Соответственно не могу ничего конкретного посоветовать, - утечки памяти ловить сложнее других ошибок и конкретного рецепта как с ними бороться - не существует.
0
|
168 / 0 / 1
Регистрация: 25.08.2014
Сообщений: 6
|
|
25.08.2014, 13:27 | 3 |
simple_html_dom - это PHP библиотека, поэтому говорить об "утечке" памяти тут не приходится. PHP устроен так, что для каждой сессии(клиентского запроса от веб-сервера или другого SAPI) образует отдельный блок памяти(ограниченный сверху настройками), который привязан к этой сессии. Превышение лимита дает всем знакомое сообщение, в котором как раз и указано - где именно осуществляют попытку выделить очередной кусок из блока, который становится фатальным. Важно понимать, что не только PHP код может вызвать превышение лимита - каждый include`нутый файл представляет собой байт-код(+к использованной памяти), служебные структуры, описывающие контекст этого байт-кода(+к использованной памяти) и много чего еще(даже отложенное создание классов на деле реализовано как дублирование записи в соответствующей hash-таблице).
По-сему: 1. unset переменных, которые далее по коду не нужны 2. повышение лимита в настройках
0
|
249 / 249 / 98
Регистрация: 26.07.2010
Сообщений: 1,685
|
|
25.08.2014, 14:46 | 4 |
по-моему сам simple_html_dom довольно кривоватый, пользовался им, возникали такие же проблемы при больших объемах, поэтому если не слишком сложный парсинг, лучше использовать регулярки, также посоветовал бы вам обратить внимание на PHPQuery
0
|
F́́́́́́́ŕ́́́́́́́é́́́ ́ak
259 / 223 / 109
Регистрация: 07.07.2014
Сообщений: 965
|
||||||
25.08.2014, 16:43 | 5 | |||||
asmprog, речь очевидно идет о CLI-демоне, ваше сообщение немного о другом.
Глупости, утчеки памяти могут быть где угодно. Как я уже писал выше - лично находил утечку в пхп'шной либе. Глупость, unset - пережиток PHP4, в подавляющем большинстве случаев он не нужен - gc сейчас и сам отлично удаляет ненужные переменные. Чем это поможет? - Ну сдохнет парсер не через 2 часа, а через 4, через день? И это никак не мешает найти строчку вызов которой приводит к утечке памяти, а потом написать баг-репорт разработчикам, если это их косяк =) Хотя маловероятно, что косяк там, т.к.:
0
|
168 / 0 / 1
Регистрация: 25.08.2014
Сообщений: 6
|
|
25.08.2014, 17:50 | 7 |
CLI-демон(Command Line Interface?) =) Глупости вашей нет предела? =) Или может быть все таки CGI(FastCGI)-демон? Да будет Вам известно, что все что "компилирует" PHP код называется SAPI и поддерживает общий интерфейс, в рамках которого требуется вызывать функции движка PHP php_request_startup/php_request_shutdown для обозначения "границ" запроса клиента перед непосредственной компиляцией PHP кода.
В PHP extension утечка быть может, а "где угодно" нет! unset вызывает деструктор(dtor) переменной, т.е. разрушается экземпляр класса, массив(и все что в массиве), память выделенная под строку освобождается. А gc вызывает цикл сборки мусора как раз при завершении сессии. Возможно, человеку банально не хватает памяти конкретный файл или порцию данных обработать. P.S. не советую Вам, Tatikoma, пороть хрень с умным видом(не в лучшем свете себя выставляете), а уж тем более спорить со мной о внутренностях интерпретатора(движка Zend в частности), поскольку я уже года 3 копаюсь в исходниках, а вот Вы в элементарных вещах умудрились запутаться.
0
|
F́́́́́́́ŕ́́́́́́́é́́́ ́ak
259 / 223 / 109
Регистрация: 07.07.2014
Сообщений: 965
|
||||||
25.08.2014, 21:54 | 8 | |||||
asmprog, вы зря употребляете слово "компиляция" к PHP-коду, т.к. ни трансляция в байт-код, не исполнение байт-кода компиляцией по-факту не является.
Под "где угодно" подразумеваются лишь места, где она может быть. Например в ядре ОС =)
Перечитайте первый пост. Человеку возможно памяти и не хватает, а компьютеру более чем достаточно - жалоба на то, что после нескольких итераций цикла объем используемой памяти неумолимо растет, хотя предполагается что после каждой итерации данные куда-то сохраняются (куда-то т.е. скриптом, например в файл) и память очищается. Переходите на PHP5, там более интересные исходники, чем в вашей версии =) PS: Даже не нашелся что ответить на ваш выпад в послесловии. Предлагаю воздержаться от перехода на личности и сохранить нетралитет дискуссии, т.к. сливание обсуждения в холивар - плохая привычка.
0
|
168 / 0 / 1
Регистрация: 25.08.2014
Сообщений: 6
|
||||||||||||||||||||||||||||||||||||
26.08.2014, 18:37 | 9 | |||||||||||||||||||||||||||||||||||
Перечитал, вот полная цитата(Вы в отдельном мире живете, где "длительный парсинг" равнозначен "нескольким итерациям цикла"?):
1. Движок Zend регистрирует ф-цию test, разбирает ее на байт-код И ДОБАВЛЯЕТ В КОНЦЕ ОПКОД ZEND_RETURN 2. Переводит в байт-код вызов ф-ции test 3. Добавляет в конце безымянной ф-ции(точки входа) опкод ZEND_RETURN 4. Затирает опкод ZEND_DECLARE_FUNCTION опкодом ZEND_NOP(второй проход) При вызове test, когда курсор виртуальной машины дойдет до опкода ZEND_RETURN в конце обработчика опкода(можно посмотреть в файле Zend\zend_vm_def.h) происходит передача управления хелперу
zval_ptr_dtor при этом является макросом, указывающим на функцию
----------------------------------------------- ---------------------НО----------------------- Все это происходит КОГДА осуществляется выход из ф-ции. А вот то, о чем я говорил: Весь C код, который я привел взят из исходников 5.3.8. Если этот пассаж выполнен в контексте , то выводы довольно сомнительные, поскольку PHP 5(из вики)
0
|
F́́́́́́́ŕ́́́́́́́é́́́ ́ak
259 / 223 / 109
Регистрация: 07.07.2014
Сообщений: 965
|
|
27.08.2014, 11:10 | 10 |
Исключительно если использовать термин утечки памяти как низкоуровневое понятие.
Случайно забытый элемент массива - чем не утечка памяти?
0
|
168 / 0 / 1
Регистрация: 25.08.2014
Сообщений: 6
|
|
27.08.2014, 11:39 | 11 |
А я смотрю, Вы неугомоннный, так ведь? Сначала у Вас CLI может быть демоном. Потом сами для себя пост ТС переврали, в чем и меня пытались "убедить". Теперь "утечка памяти" у Вас носит не тот смысл, которым данный термин все НОРМАЛЬНЫЕ программисты наделяют. Что такое? Увидели новорега(меня) на форуме и ринулись ему свой авторитет доказывать? Да только новорег не такой простой оказался? Вот и приходится в спешном порядке цепляться к слову "компиляция" и утечкой памяти называть то, что ей не является, только бы сохранить "хорошую мину при плохой игре"?
0
|
ads
|
27.08.2014, 12:21
#12
|
0
|
Почетный модератор
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
|
|
27.08.2014, 13:59 | 13 |
Мда.. Веселое обсуждение, нечего сказать. Столько слов об утечке памяти.. И что-то никто не предложил, к примеру, парсить xml по частям. Непонятно, чем тут поможет то, что будешь знать место "утечки"
0
|
249 / 249 / 98
Регистрация: 26.07.2010
Сообщений: 1,685
|
|
27.08.2014, 14:04 | 14 |
я ошибаюсь, или человек парсит контент с другого сайта а не с xml?
0
|
249 / 249 / 98
Регистрация: 26.07.2010
Сообщений: 1,685
|
|
27.08.2014, 14:11 | 16 |
наверное вы правы, но мы не узнаем истины, пока создатель темы не скажет, что он парсит
0
|
Игорь[Igor]
|
27.08.2014, 14:30
#17
|
0
|
KOPOJI
|
27.08.2014, 14:31
#18
|
Не по теме: Игорь[Igor], :D
0
|
Tatikoma
|
27.08.2014, 18:10
#19
|
0
|
KOPOJI
|
27.08.2014, 19:31
Выявить утечку памяти
#20
|
0
|
27.08.2014, 19:31 | |
Изолировать утечку памяти Найти утечку памяти Определить утечку памяти Как устранить утечку памяти? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |