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 ;
}