Codeigniter Datamapper - Создание новых объектов, а не освобождение памяти

Я использую Datamapper, чтобы в основном синхронизировать кучу необработанных данных в одной базе данных с более нормализованной базой данных. Я уже настроил два набора моделей, по одному для каждой базы данных, обе расширяют DM. Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно импортировать данные в виде гигабайтов в новую базу данных, и когда я создаю новые объекты DM в моем контроллере, они, похоже, не освобождаются при возврате того метода, который его создает. Модели не загружают отношения.

$clients = $this->client->get_iterated();
foreach($clients as $client) {
  $this->addUser($client);
}

а в addUser() он создает новый объект User, сохраняет его и возвращает. Когда я выводлю использование памяти, оно просто увеличивается, пока не исчерпает все. Сначала я подумал, что это связано с тем, что PHP создавал копию объекта $client, передаваемого в addUser(), но просто помещал return в качестве первой строки addUser(), не показывая увеличения памяти. Это только когда я создаю новый объект User и сохраняю его.

Я пытался использовать $user->clear() до конца метода, но безрезультатно.

Стоит отметить, что приложение изначально работало на необработанных моделях баз данных просто отлично. Новые модели создаются, сохраняются, а затем никогда не освобождаются. Это буквально пережует 2 гигабайта памяти за несколько минут.

1 ответ

У меня тоже была эта проблема и я потратил много часов на отладку. Мы нашли единственный способ обойти это - использовать в вашей модели одноэлементный экземпляр для операций, создающих много экземпляров, таких как:

static function get_utility_instance() {
    if ( !self::$utility_instance ) {
        self::$utility_instance = new User_model() ;
    }
    self::$utility_instance->clear() ;
    return self::$utility_instance ;
}
Другие вопросы по тегам