在Symfony3中,我使用Doctrine的QueryBuilder从我的3500万行表中迭代多达50万行:
$query = $this->createQueryBuilder('l')
->where('l.foo = :foo')
->setParameter('foo', $foo)
->getQuery();
$results = $query->iterate();
foreach ($results as $result) {
$em->clear();
// My logic using $result[0]
}
在我开始迭代之前,它的内存使用量经常接近512mb。有没有进一步的方法可以优化它?我阅读到的水合在迭代查询时是关闭的,对吗?
2条答案
按热度按时间nqwrtyyt1#
我在generators上得到了很好的结果。也许在一个单独的方法中处理结果可以帮助PHP清理未使用的对象。我不确定你在处理记录时做了什么,也不能保证你会得到相同的结果,但在我的例子中,内存消耗在整个脚本执行过程中保持不变:
如果这样做没有帮助,考虑用DBAL或PDO进行查询(都使用
fetch()
方法,以避免一次获取所有记录)Doctrine的迭代器可能会泄漏内存(PDO的结果集不会)。教条能解决你80%的问题,剩下的20%最好不要教条。
迭代查询时水合是关闭的,我的阅读是否正确?
不能,除非你改变水合模式,你可以通过给
iterate()
方法传递第二个参数来实现。a11xaf1n2#
理论文档中的示例