我正在使用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
环境中):
logging
中profiling
和doctrine.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?