超大表导致允许的内存大小为 x 字节耗尽错误
Posted
技术标签:
【中文标题】超大表导致允许的内存大小为 x 字节耗尽错误【英文标题】:Extra big table causes a Allowed memory size of x bytes exhausted error 【发布时间】:2015-12-29 15:54:47 【问题描述】:我有一个实体连接到一个大表:200.000 行。
我面临的问题是,当我将实体对象绑定到表单中时,出现以下错误:
致命错误:允许的内存大小为 134217728 字节已用尽(已尝试 分配85个字节)在 /../public_html/application/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php 在第 296 行
注解是:
/**
* @ORM\OneToMany(targetEntity="This\Entity\Table", mappedBy="id")
**/
private $sometable;
我认为正在发生的事情是 Doctrine 正在尝试将表加载到内存中,这就是杀死进程的原因。
当我注释掉表格时,一切都按预期工作。
我阅读了有关延迟加载的内容并尝试将其添加到注释中:
fetch="EXTRA_LAZY"
但它并没有解决问题。
我通过服务加载实体:
$object = $this->someRepository->find($id);
// And bind..
$this->form->bind($object);
处理此类事情的正确方法是什么?
【问题讨论】:
在不知道相关表中的数据大小、查询方式、关联方式(单双向/直接)和当前配置的DoctrineORMModule的情况下,很难说出内存耗尽的正确原因。出于开发目的,128M
的内存非常低,无法用于大型、成熟和复杂的库,例如教义。我强烈建议将php.ini
中的memory_limit
增加到256M
或更高。你能再改进一下这个问题吗?例如,您的环境是否启用了xdebug
?
【参考方案1】:
对不起,200k 的表并不庞大,实际上,没有接近它的地方,mysql 应该在亚秒时间内返回这样的查询。因此我认为问题出在你的映射和索引或缺乏。您还应该查看数据库缓存,但首先要整理索引和查询。
用更多代码更新您的问题。
【讨论】:
以上是关于超大表导致允许的内存大小为 x 字节耗尽错误的主要内容,如果未能解决你的问题,请参考以下文章
Laravel - 在简单的数据库查询内存泄漏/“允许的内存大小为 .. 字节耗尽”之后 [重复]
即使在调整 php.ini 后,允许的 *** 字节内存大小也会耗尽