Использование памяти пхп, объясните

ali7
На сайте с 21.02.2010
Offline
25
860

Здравствуйте, уважаемые форумчане.

Растолкуйте, пожалуйста, следующее явление.

<?php

function convert($size)
{
$unit=array('b','kb','mb','gb','tb','pb');
return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}
echo convert(memory_get_usage());
//316.12 kb

<?php

function convert($size)
{
$unit=array('b','kb','mb','gb','tb','pb');
return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}
$xml = simplexml_load_file('1.fb2'); //Файл 1.fb2 весит около 1,2 Мб
echo convert(memory_get_usage());
//317.26 kb

Почему так происходит? Пхп же создает объект $xml который занимает память. Не пойму :no:

Тут должна быть моя подпись
LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#1

Так он мгновенно его считывает и выплёвывает или как вы хотели?! И вообще в чём вопрос то?

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
ali7
На сайте с 21.02.2010
Offline
25
#2

А если он его выплевывает, тогда как он с ним дальше работает?

<?php


function convert($size)
{
$unit=array('b','kb','mb','gb','tb','pb');
return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}

$xml = simplexml_load_file('1.fb2');

echo convert(memory_get_usage()) . '<br />'; //319.6 kb

foreach ($xml->body as $parrent=>$children){
echo count($children) . '<br />';
}

echo convert(memory_get_usage()) . '<br />'; //320.43 kb

[umka]
На сайте с 25.05.2008
Offline
456
#3

А в чём именно вопрос?

xml-файл лишь в "человекочитабельном" виде весит 1.2 мб

А когда он в виде структуры в памяти, он вполне может весить меньше.

Лог в помощь!
ali7
На сайте с 21.02.2010
Offline
25
#4
'[umka:
;8759236']А в чём именно вопрос?

Вобщем я делаю библиотеку фб2. Решил потестировать скрипты на быстродействие, использование памяти и т.д. И вот тут наткнулся на сабж. Мне интересно как так выходит, когда пхп читает 1 мб файл а на использовании памяти скриптом это почти не заметно.

'[umka:
;8759236']
xml-файл лишь в "человекочитабельном" виде весит 1.2 мб
А когда он в виде структуры в памяти, он вполне может весить меньше.

Не думаю, что 1.2 мб "человекочитабельного" хмл помещается в 1 Кб.

З.Ы. Понимание этого мне нужно для оптимизации работы будущего сайта.

[umka]
На сайте с 25.05.2008
Offline
456
#5

Попробуйте сделать xml-файл всего с одной текстовой строкой, длиной 1мб, а так же, выключить всякие акселераторы и пр.

И посмотрите, сколько будет кушать скрипт.

Чудес не бывает :)

[umka] добавил 02.04.2011 в 02:02

Попробуйте вызывать memory_get_usage(true);

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

edogs software
На сайте с 15.12.2005
Offline
775
#6

simplexml_load_file это по сути сторонняя к php либа.

память она имеет честь кушать совершенно по особому, поэтому

а) в мемори лимитах это не учитывается поэтому пхп функции для измерения бесполезны

б) расширение мемори-лимита не поможет если памяти будет не хватать

Поэтому для больших файлов лучше использовать потоковые либы.

p.s.: и хотя это не баг, тем не менее ответ взят отсюда http://bugs.php.net/45291 (последний абзац)

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
B
На сайте с 25.02.2009
Offline
68
#7

Во первых надо еще посмотреть память на пике при помощи memory_get_peak_usage - если весь скрипт состоит только из процитированного кода, то вполне возможно, что память могла быть освобождена, также вариант что парсится xml потоком, не загружая предварительно файл, а xml в виде дом заниммает в разы меньше места

Бесплатная CMS LitePublisher это блог, вики, тикет система, голосование (http://litepublisher.ru/) на высокой скорости с минимум памяти
ali7
На сайте с 21.02.2010
Offline
25
#8
blogolet:
Во первых надо еще посмотреть память на пике при помощи memory_get_peak_usage

На пиковое использование памяти я тоже смотрел. Оно отличается разве что на несколько байт.

В любом случае всем спасибо за объяснение. Немного прояснили ситуацию.

ali7 добавил 02.04.2011 в 11:40

edogs:
p.s.: и хотя это не баг, тем не менее ответ взят отсюда http://bugs.php.net/45291 (последний абзац)

Вот теперь все стало ясно :) Спасибо большое!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий