【问题标题】:Doctrine - memory exhausted on Sonata Admin?Doctrine - Sonata Admin 上的内存已耗尽?
【发布时间】:2023-03-10 09:23:01
【问题描述】:

我有Movie 实体,它与ActorDirectorProducer,Company` 等实体有ManyToMany 连接。

在编辑电影时,有很多实体(演员:90k,导演:40k,制片人:20k,公司:40k)可供选择。

当我尝试在 Sonata Admin 中为我的实体加载“编辑”页面时,我收到错误 500,并且 php 日志在以下文件之一中显示 Allowed memory size of 134217728 bytes exhausted

\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php on line 2577
\vendor\doctrine\orm\lib\Doctrine\ORM\Internal\Hydration\AbstractHydrator.php on line 296
\vendor\doctrine\orm\lib\Doctrine\ORM\Internal\Hydration\ObjectHydrator.php on line 529

当每个实体在 DB 中有大约 10 个对象时,它适用于固定装置。

我目前正在测试迁移,我假设编辑页面上会有大量数据,页面本身可能运行缓慢(将有四个 select2 字段,每个多选,每个都有数千个实体连接到已编辑的实体),但我很惊讶它发生在 Doctrine 级别。我希望 Sonata Admin 能够处理它,因为它在列出大量 Actor 对象、分页等方面没有问题。

我应该如何安排与Movie 实体的合作?你能给我一些建议吗?我在考虑 changing that CRUD page 所以 Select2 会使用 Ajax 获取数据,但我仍然不确定这是一个最佳主意。

【问题讨论】:

    标签: symfony out-of-memory sonata-admin


    【解决方案1】:

    您需要考虑如何使用该应用程序。 在您的编辑面板中,您是否认为您的实体上所有可能的关系(演员、导演……)的列表将是最好的用户体验,我不这么认为。

    您的实体将获取所有依赖项并将它们水合到对象中。即使您将内存限制设置为 1To,您也可以看到它是如何影响您的内存的。

    我建议使用自动完成功能。这样您就不会加载数千个无用的数据,应用程序将更快,用户将能够搜索他正在寻找的内容,而不是在无休止的选择框中搜索。

    希望对你有帮助。

    【讨论】:

    • 是的,我现在正在研究自动完成功能。我已经为搜索做了 api 动作,唯一的问题是奏鸣曲定制,这对我来说是地狱......编辑:希望 SONATA_TYPE_MODEL_AUTOCOMPLETE 能帮助我。
    • 最后 - 看起来它可以与 SONATA_TYPE_MODEL_AUTOCOMPLETE 一起使用。现在我只需要更改“用户”端 - 我会尝试 PUGXAutocompleterBundle,也许它会很轻松。谢谢。
    【解决方案2】:

    您可以通过向 php.ini 添加更多来增加 memory_limit

    在 AppKernel.php 顶部找到正确的一个位置 phpInfo(); 并在输出中搜索“php.ini”,然后编辑 ini 文件并将“memory_limit”行更改为 2G 例如

    如果可能的话,您应该避免导致内存大小耗尽的对象水合(将结果行水合为实体),这里有一些关于此的信息

    http://labs.octivi.com/mastering-symfony2-performance-doctrine/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-10
      • 2012-04-30
      • 2015-08-23
      • 2012-11-10
      • 2012-08-19
      • 2011-02-09
      • 2015-10-01
      • 2018-12-11
      相关资源
      最近更新 更多