Растет память при запросах к БД

Уже исправленные репорты или принятые предложения
Ответить
fredrsf
Сообщения: 20
Зарегистрирован: 2013.05.04, 22:40

Растет память при запросах к БД

Сообщение fredrsf » 2013.10.18, 17:12

Вот такой код:

Код: Выделить всё

foreach($updates as $update){
                    echo 'START_DB:' . memory_get_usage()."\n";
                    $sql = "SELECT *
                            FROM positions
                            WHERE relation_id = {$request['id_relation']}
                            AND positions_date = {$update}";

                    $position = $this->connection->createCommand($sql)->queryAll();
                    unset($position);
                    echo 'FINISH_DB:' . memory_get_usage()."\n";
                }
Выводит:
FINISH_DB:7779984
START_DB:7779984
FINISH_DB:7781104
START_DB:7781104
FINISH_DB:7782224
START_DB:7782224
FINISH_DB:7783344
START_DB:7783344
FINISH_DB:7784464
START_DB:7784464
FINISH_DB:7785584
START_DB:7785584
FINISH_DB:7786704
...
...
...
FINISH_DB:184015872
START_DB:184015872
FINISH_DB:184017008
START_DB:184017008
FINISH_DB:184018144
FINISH:183853032

Память растет очень быстро.

Если использовать mysqli:

Код: Выделить всё

foreach($updates as $update){
                    echo 'START_DB:' . memory_get_usage()."\n";
                    $sql = "SELECT *
                            FROM positions
                            WHERE relation_id = {$request['id_relation']}
                            AND positions_date = {$update}";

                    $result = $this->link->query($sql);
                    unset($result);
                    echo 'FINISH_DB:' . memory_get_usage()."\n";
}
Выводит:
START_DB:6230776
FINISH_DB:6230776
START_DB:6230776
FINISH_DB:6230776
START_DB:6230776
FINISH_DB:6230776
START_DB:6230776
FINISH_DB:6230776
START_DB:6230776
FINISH_DB:6230776
START_DB:6230776
FINISH_DB:6230776
START_DB:6230776
FINISH_DB:6230776
START_DB:6230776
FINISH_DB:6230776
FINISH:6070752
Память держится всегда одной и той же.
Замечу, что исполнение скрипта идет по крону в классе наследованном от CConsoleCommand
В чем может быть проблема? Может быть это ошибка в yii?

Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Растет память при запросах к БД

Сообщение anton44eg » 2013.10.18, 18:22

а что такое $this->connection ?

fredrsf
Сообщения: 20
Зарегистрирован: 2013.05.04, 22:40

Re: Растет память при запросах к БД

Сообщение fredrsf » 2013.10.19, 11:35

anton44eg писал(а):а что такое $this->connection ?
$connection=Yii::app()->db;
На самом деле изначально там был ActiveRecord, просто когда память сжиралась и стали выяснять проблему заменили на DAO

Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Растет память при запросах к БД

Сообщение anton44eg » 2013.10.19, 12:19

уверены, что не открывается новый connection?

Аватара пользователя
slavcodev
Сообщения: 3133
Зарегистрирован: 2009.04.02, 21:42
Откуда: Altea, Spain
Контактная информация:

Re: Растет память при запросах к БД

Сообщение slavcodev » 2013.10.19, 20:35

А так растет сжирает память? :)

Код: Выделить всё

$command = $this->connection->createCommand("SELECT *
    FROM positions
    WHERE relation_id = :relationId
    AND positions_date = :updateDate");

foreach($updates as $update){
  echo 'START_DB:' . memory_get_usage()."\n";
  $command->params = array(
    ':relationId' => $request['id_relation'],
    ':updateDate' => $update,
  );

  $position = $command->queryAll();
  unset($position);
  echo 'FINISH_DB:' . memory_get_usage()."\n";
} 
createCommand создает каждый раз новый объект.
Жду Yii 3!

fredrsf
Сообщения: 20
Зарегистрирован: 2013.05.04, 22:40

Re: Растет память при запросах к БД

Сообщение fredrsf » 2013.10.21, 09:41

mc-bear писал(а):А так растет сжирает память? :)

Код: Выделить всё

$command = $this->connection->createCommand("SELECT *
    FROM positions
    WHERE relation_id = :relationId
    AND positions_date = :updateDate");

foreach($updates as $update){
  echo 'START_DB:' . memory_get_usage()."\n";
  $command->params = array(
    ':relationId' => $request['id_relation'],
    ':updateDate' => $update,
  );

  $position = $command->queryAll();
  unset($position);
  echo 'FINISH_DB:' . memory_get_usage()."\n";
}  
createCommand создает каждый раз новый объект.
Сделал, как вы описали. Память стала расти медленнее, но по прежнему растет. С 5 мб выросла до 191 мб.

fredrsf
Сообщения: 20
Зарегистрирован: 2013.05.04, 22:40

Re: Растет память при запросах к БД

Сообщение fredrsf » 2013.10.21, 11:43

Блин... Оказывается все просто...
В файле cron.php

Код: Выделить всё

<?php
$yiic=dirname(__FILE__).'/../framework/yiic.php';
$config=dirname(__FILE__).'/config/cron.php';
require_once($yiic);
 
Добавил:

Код: Выделить всё

<?php
$yiic=dirname(__FILE__).'/../framework/yiic.php';
$config=dirname(__FILE__).'/config/cron.php';
defined('YII_DEBUG') or define('YII_DEBUG',false);

require_once($yiic);
 
То есть отключил дебаг. Об этом узнал из:
http://www.yiiframework.com/forum/index ... s-objects/

Всем большое спасибо!

Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Растет память при запросах к БД

Сообщение anton44eg » 2013.10.21, 12:52

А, ну естественно, что с дебагом у вас трейсы память съедали

Ответить