gpt4 book ai didi

php/symfony/doctrine 内存泄漏?

转载 作者:IT王子 更新时间:2023-10-29 00:15:12 25 4
gpt4 key购买 nike

我在使用 symfony 1.4 和 doctrine 1.2 将对象批量插入数据库时​​遇到问题。

我的模型有一种叫做“Sector”的对象,每个对象都有几个“Cupo”类型的对象(通常从 50 到 200000)。这些物体很小;只是一个简短的标识符字符串和一个或两个整数。每当用户创建一组扇区时,我需要自动将所有这些“Cupo”实例添加到数据库中。万一出现任何问题,我正在使用 Doctrine 事务来回滚所有内容。问题是在 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 的对象都会失败。感谢您的帮助。

最佳答案

尝试过

$cupo->save();
$cupo->free();
$cupo = null;

(但替换我的代码)而且我仍然遇到内存溢出。还有其他想法吗?

更新:

我在我的 databases.yml 中创建了一个新环境,它看起来像:

all:
doctrine:
class: sfDoctrineDatabase
param:
dsn: 'mysql:host=localhost;dbname=.......'
username: .....
password: .....
profiler: false

profiler: false 条目禁用 doctrine 的查询日志记录,它通常会保留您所做的每个查询的副本。它并没有阻止内存泄漏,但我的数据导入速度是没有它时的两倍。

更新 2

我加了

Doctrine_Manager::connection()->setAttribute(Doctrine_Core::ATTR_AUTO_FREE_QUERY_OBJECTS, true ); 

在运行我的查询之前,并更改

$cupo = null;

unset($cupo);

现在我的脚本一直在愉快地搅拌。我很确定这次它会在没有用完 RAM 的情况下完成。

更新 3

是的。这就是获胜组合。

关于php/symfony/doctrine 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2097744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com