Tengo problemas con la inserción de objetos en una base de datos por lotes utilizando Symfony 1.4 y doctrine 1.2.php/symfony/doctrine memory leak?
Mi modelo tiene un cierto tipo de objeto llamado "Sector", cada uno de los cuales tiene varios objetos de tipo "Cupo" (generalmente desde 50 hasta 200000). Estos objetos son bastante pequeños; solo una cadena identificativa corta y uno o dos enteros. Cuando el usuario crea un grupo de Sectores, necesito agregar automáticamente todas estas instancias de "Cupo" a la base de datos. En caso de que algo salga mal, estoy usando una transacción de doctrina para deshacer todo. El problema es que solo puedo crear unas 2000 instancias antes de que php se quede sin memoria. Actualmente tiene un límite de 128 MB, que debería ser más que suficiente para manejar objetos que usan menos de 100 bytes. Intenté aumentar el límite de memoria de hasta 512 MB, pero php aún falla y eso no resuelve el problema. ¿Estoy haciendo la inserción del lote correctamente o hay una mejor manera?
Aquí está el error:
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
Y aquí está el código:
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;
}
Una vez más, este código funciona bien por menos de 1.000 objetos, pero nada más grande que 1.500 falla. Gracias por la ayuda.
marque la respuesta de alguien como correcta, ¿eh? – develop7
Para inserciones en bloque, también puede considerar realizar una inserción de SQL sin procesar a través de PDO, sin duda será más rápido y no perderá memoria. –