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

  • Автор темы Автор темы Olsufr
  • Дата начала Дата начала

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
думаю память просто помечается как не используемая, а освобождается при необходимости.
440hz, в таком случае получается, что функция memory_get_usage() выдает ложную информацию? Т.е. память помечается как не используемая, а эта функция не замечает этого факта?
Есть сомнения, что это так.
Кроме того, после выборки каждой из строк расходуемая память меняется, а после mysql_free_result() -- нет. Тоже как-то не логично будет.
 
подразумевается, что с мускулем работать будешь не одним запросом, по этому после free_result и повтороного запроса и фетча памяти сожреться чуть-чуть больше (при идентичных запросах с теме же результатами памяти съедалось на 12 байт больше)... если хочется освободить память, то делай закрытие соединения, еще одно - с pconnect ест памяти меньше чем connect, не знаю как на толстых выборках, но разница может и пропасть, впрочем при тех же толстых выборках могут быть совсем другие цифры
 
Тогда вообще какой смысл в функции mysql_free_result(), если после ее применения занятая память не уменьшается,
а для ее уменьшения нужно:
если хочется освободить память, то делай закрытие соединения
?
Или я где-то ошибаюсь в рассуждениях.
 
Память используемая скриптом php и mysql это немножко разные вещи. И mysql_free_result здесь не поможет.
 
Автор оригинала: 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";
  }
}
?>

как говориться - почувствуйте разницу...
 
ап=)
Собстенно, возник вопрос, какую память 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.
 
а ты подумай. ну и на вышеприведенный кодdesperado посмотри.
 
Сверху