超大表导致允许的内存大小为 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 字节耗尽错误的主要内容,如果未能解决你的问题,请参考以下文章

将sql查询存储在列表中时PHP内存耗尽

Laravel - 在简单的数据库查询内存泄漏/“允许的内存大小为 .. 字节耗尽”之后 [重复]

即使在调整 php.ini 后,允许的 *** 字节内存大小也会耗尽

Laravel 的 CheckForMaintenanceMode 中间件中允许的内存大小耗尽

如何修复 PHPExcel 耗尽的内存?

已用完 X 字节的允许内存大小