Управление расходом памяти при работе с MySQL

Olsufr

Guest
Управление расходом памяти при работе с MySQL

Помогите понять, каким образом используется память PHP-скриптом при запросах к MySQL и каким образом эту память можно было бы сэкономить.

Скрипт:
PHP:
print "memory before query: ". memory_get_usage() . "<br>";
$result = mysql_query($sql);
print "memory after query and before first fetch: ". memory_get_usage() . "<br>";
while ($row = mysql_fetch_array($result)) {
    print "=========start row:=========<br>";
    print "memory after one fetch: ". memory_get_usage() . "<br>";
    print "=========end row=========<br>";
}
print "memory after all fetches: ". memory_get_usage() . "<br>";
mysql_free_result($result);
print "memory after free query: ". memory_get_usage() . "<br>";

print "memory before unset: ". memory_get_usage() . "<br>";
unset($result, $row);
print "memory after unset: ". memory_get_usage() . "<br>";
дает такой результат:
memory before query: 33264
memory after query and before first fetch: 33536
=========start row:=========
memory after one fetch: 40336
=========end row=========
=========start row:=========
memory after one fetch: 46736
=========end row=========
=========start row:=========
memory after one fetch: 46416
=========end row=========
=========start row:=========
memory after one fetch: 48016
=========end row=========
=========start row:=========
memory after one fetch: 47040
=========end row=========
memory after all fetches: 45224
memory after free query: 45224
memory before unset: 45224
memory after unset: 45224
Т.е. занимаемая PHP память после запроса и его обработки увеличилась
и уменьшить ее не помогли ни mysql_free_result(), ни unset().

Подскажите в чем тут дело.

PHP Version 4.4.2-1
 

440hz

php.ru
думаю память просто помечается как не используемая, а освобождается при необходимости.
 

Olsufr

Guest
Автор оригинала: 440hz
думаю память просто помечается как не используемая, а освобождается при необходимости.
440hz, в таком случае получается, что функция memory_get_usage() выдает ложную информацию? Т.е. память помечается как не используемая, а эта функция не замечает этого факта?
Есть сомнения, что это так.
Кроме того, после выборки каждой из строк расходуемая память меняется, а после mysql_free_result() -- нет. Тоже как-то не логично будет.
 

desperado

Новичок
подразумевается, что с мускулем работать будешь не одним запросом, по этому после free_result и повтороного запроса и фетча памяти сожреться чуть-чуть больше (при идентичных запросах с теме же результатами памяти съедалось на 12 байт больше)... если хочется освободить память, то делай закрытие соединения, еще одно - с pconnect ест памяти меньше чем connect, не знаю как на толстых выборках, но разница может и пропасть, впрочем при тех же толстых выборках могут быть совсем другие цифры
 

Olsufr

Guest
Тогда вообще какой смысл в функции mysql_free_result(), если после ее применения занятая память не уменьшается,
а для ее уменьшения нужно:
если хочется освободить память, то делай закрытие соединения
?
Или я где-то ошибаюсь в рассуждениях.
 

Navarro

Новичок
Память используемая скриптом php и mysql это немножко разные вещи. И mysql_free_result здесь не поможет.
 

desperado

Новичок
Автор оригинала: Olsufr
Тогда вообще какой смысл в функции mysql_free_result(), если после ее применения занятая память не уменьшается,
а для ее уменьшения нужно:
?
Или я где-то ошибаюсь в рассуждениях.
смысл простой (он был озвучан сразу) - помечает память как не использованную.

крохотный эксперемент:
PHP:
<?
mysql_pconnect("127.0.0.1","root","*****");
mysql_select_db("mysql");
echo "on start: ".memory_get_usage() . "\n";

for ($r = 0; $r<10; $r++){
  $i = 0;
  $res[$r] = mysql_query("select User from user limit 0,4");
  echo "after query: ".memory_get_usage() . "\n";
  while ($row = mysql_fetch_array($res[$r])){
    $i++;
    echo "after fetch [". $i . "]: ".memory_get_usage() . "\n";
  }

  mysql_free_result($res[$r]);
  echo "after free_result: ".memory_get_usage() . "\n";

  unset($res[$r], $row);
  echo "after unset: ".memory_get_usage() . "\n";

}
?>
и
PHP:
<?
mysql_pconnect("127.0.0.1","root","*****");
mysql_select_db("mysql");
echo "on start: ".memory_get_usage() . "\n";

for ($r = 0; $r<10; $r++){
  $i = 0;
  $res[$r] = mysql_query("select User from user limit 0,4");
  echo "after query: ".memory_get_usage() . "\n";
  while ($row = mysql_fetch_array($res[$r])){
    $i++;
    echo "after fetch [". $i . "]: ".memory_get_usage() . "\n";
  }
}
?>
как говориться - почувствуйте разницу...
 

Гравицапа

elbirret elcno
ап=)
Собстенно, возник вопрос, какую память mysql_free_result() освобождает вообще? Память выделенную для хранения результата на стороне сиквел сервера? Может кто-то наиболее точно ответить на этот вопрос?
Просто в мане про это сказанно достаточно общими словами
mysql_free_result() will free all memory associated with the result identifier result.

mysql_free_result() only needs to be called if you are concerned about how much memory is being used for queries that return large result sets. All associated result memory is automatically freed at the end of the script's execution.
 

fixxxer

К.О.
Партнер клуба
а ты подумай. ну и на вышеприведенный кодdesperado посмотри.
 
Сверху