У меня проблемы с пакетной вставкой объектов в базу данных с использованием Symfony 1.4 и Doctrine 1.2.
В моей модели есть объект определенного типа, называемый «Сектор», каждый из которых имеет несколько объектов типа «Купо» (обычно в диапазоне от 50 до 200000). Эти объекты довольно маленькие; просто короткая строка идентификатора и одно или два целых числа. Всякий раз, когда пользователь создает группу секторов, мне нужно автоматически добавлять все эти экземпляры «Cupo» в базу данных. На случай, если что-то пойдет не так, я использую транзакцию доктрины для отката всего. Проблема в том, что я могу создать только около 2000 экземпляров, прежде чем php не хватит памяти. В настоящее время он имеет ограничение в 128 МБ, которого должно быть более чем достаточно для обработки объектов, использующих менее 100 байтов. Я пытался увеличить лимит памяти до 512 МБ, но php все еще падает, и это не решает проблему. Правильно ли выполняется пакетная вставка или есть способ получше?
Вот ошибка:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes) in /Users/yo/Sites/grifoo/lib/vendor/symfony/lib/log/sfVarLogger.class.php on line 170
А вот код:
public function save($conn=null){
$conn=$conn?$conn:Doctrine_Manager::connection();
$conn->beginTransaction();
try {
$evento=$this->object;
foreach($evento->getSectores() as $s){
for($j=0;$j<$s->getCapacity();$j++){
$cupo=new Cupo();
$cupo->setActivo($s->getActivo());
$cupo->setEventoId($s->getEventoId());
$cupo->setNombre($j);
$cupo->setSector($s);
$cupo->save();
}
}
$conn->commit();
return;
}
catch (Exception $e) {
$conn->rollback();
throw $e;
}
Еще раз, этот код отлично работает для менее чем 1000 объектов, но все, что больше 1500, терпит неудачу. Спасибо за помощь.