Symfony2:Doctrine的查询分配了大量的内存

时间:2016-10-03 13:21:04

标签: php performance symfony doctrine-orm

我正在使用Doctrine的queryBuilder进行过滤,它返回大约80k条记录。我只选择三个字段(两个连接实体的两个ID和一个字符串,长度为255的字符串(从不那么长,通常大约30-40个字符)。我使用getArrayResult()

$filterResult = $this->getDoctrine()->getRepository('Bundle:Entity')
    ->createQueryBuilder('alias')
    -> // selects, joins, wheres
    ->getArrayResult();

我理解它可能需要一些时间来执行,因为有些连接等,但是我注意到在执行并将结果保存到变量(数组,80k记录,每个是3的数组:id / id / name)之后)消耗的内存大约 70MB

我实际上是逐行检查的,在发送查询之前没有任何内容(创建查询构建器,处理表单来构建过滤器)会显着增加内存。

这很奇怪,因为在另一个地方我只用

将一列保存到简单数组
$idsOnly = array_column($filterResult, "id"); // 80k of IDs

大约需要4MB。

现在,我尝试过(当然在prod环境中):
 loggingprofilingdoctrine.dbal的{​​{1}}设置为false(config.yml中没有任何内容,因此我认为它保持在config_prod.yml)   - 位于控制器顶部的过滤操作中的prod
  - $this->getDoctrine()->getConnection()->getConfiguration()->setSQLLogger(null);,然后$filterResult = null;
  - gc_collect_cycles()$em->clear()几乎无处不在

没有任何改变。从我的角度来看,要么多维数组占用太多空间,要么从DB中获取结果时,Doctrine会留下一些垃圾。我还应该尝试什么,除了NativeSQL?

0 个答案:

没有答案