我使用的symfony 1.4和1.2学说具有到数据库与对象的批量插入的问题。php/symfony/doctrine内存泄漏?
我的模型具有一定类型的对象称为“扇区”,其中的每一个具有类型“Cupo”的多个对象(通常范围从50到20万)。这些物体非常小,只是一个简短的标识符字符串和一个或两个整数。每当用户创建一组扇区时,我需要自动将所有这些“Cupo”实例添加到数据库中。如果出现任何问题,我正在使用原则事务来回滚所有内容。问题是我只能在php耗尽内存之前创建大约2000个实例。它目前有128MB的限制,对于处理少于100个字节的对象应该足够了。我试图增加内存限制到512MB,但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更大的失败。谢谢您的帮助。
标记某人的回答是正确的,呃? – develop7 2010-01-24 17:21:38
对于批量插入,您可能还想考虑通过PDO执行原始SQL插入,它肯定会更快,并且不会泄漏内存。 – 2012-11-28 00:30:35