Mam problemy z wsadowym wstawieniem obiektów do bazy danych przy użyciu symfony 1.4 i doktryny 1.2.wyciek pamięci php/symfony/doctrine?
Mój model ma pewien rodzaj obiektu o nazwie "Sektor", z których każdy ma kilka obiektów typu "Cupo" (zwykle od 50 do 200000). Te obiekty są dość małe; tylko krótki ciąg identyfikacyjny i jedna lub dwie liczby całkowite. Ilekroć grupa Sektorów jest tworzona przez użytkownika, muszę automatycznie dodać wszystkie te wystąpienia "Cupo" do bazy danych. W przypadku, gdy coś pójdzie nie tak, używam operacji doktryny, aby wycofać wszystko. Problem polega na tym, że mogę utworzyć tylko około 2000 instancji, zanim phpowi zabraknie pamięci. Obecnie ma limit 128 MB, co powinno wystarczyć do obsługi obiektów, które używają mniej niż 100 bajtów. Próbowałem zwiększyć limit pamięci do 512 MB, ale php nadal zawiesza się i to nie rozwiązuje problemu. Czy poprawnie wstawiam partię lub czy jest lepszy sposób?
Oto błąd:
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
A oto kod:
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;
}
Znów ten kod działa poprawnie na mniej niż 1000 obiektów, ale nic nie większy niż 1500. Dzięki za pomoc.
oznaczyć czyjąś odpowiedź jako poprawną, prawda? – develop7
W przypadku wkładek luzem możesz również rozważyć wykonanie surowej wstawki SQL za pośrednictwem PDO, zdecydowanie szybciej i nie spowoduje to przecieku pamięci. –