- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在使用 Symfony 1.4 和 Doctrine。
到目前为止,我使用 Symfony 运行任务没有问题。但是现在我必须导入大量数据并将它们保存在数据库中,我得到了臭名昭著的
"Fatal Error: Allowed memory size of XXXX bytes exhausted"
在此导入期间,我只是创建新对象、设置一些字段并保存它们。
我很确定这与我在保存数据时创建的对象数量有关。但是,取消设置这些对象并没有任何作用。
在 Symfony 中是否有限制内存使用的最佳实践?
最佳答案
我遇到过这个问题,我发现有一些技术对 Doctrine 的大量内存使用确实有帮助。
1:在可能的情况下,将 Doctrine 查询结果合并为一个数组。您可以按以下方式执行此操作,例如:
$query = self::createQuery("q")->
...
->setHydrationMode(Doctrine::HYDRATE_ARRAY)
->execute();
这迫使 Doctrine 不创建大对象,而是将其缩减为数组。显然请记住,如果你这样做,你将失去调用方法等的能力,所以这只有在你使用它来读取字段值等时才有用。
2:执行后释放结果。这记录在 Doctrine 文档的一小部分区域中,但它确实帮助了我正在使用的导入任务:
$query->free();
就是这样。你也可以在你创建的对象上执行此操作,例如 $myObj->free();
这会强制 Doctrine 删除它创建的所有循环引用。请注意,从 PHP 5.3 开始,循环引用会在通过 PHP 范围或 unset()
删除对象时自动释放,但在此之前您需要自己完成。
在你使用它们之后取消设置变量也有帮助,尽管与上面提到的 free()
方法结合使用,因为 unset()
不会否则清除循环引用。
关于php - 如何在 Symfony 1.4 中运行任务时使用更少的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2463337/
我是一名优秀的程序员,十分优秀!