我正在尝试使用Doctrine选择一百万行但是遇到了一些问题。
首先我尝试使用ORM查询,但后来我发现原生查询更快。(我不需要ORM映射)。
我已经在使用数组保护器(因为我只需要读取数据,因此创建对象毫无意义)。
我也听说过PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY,但如果我将其关闭,我会收到错误,因为我正在同时处理多个结果集(游标)。
因此内存使用率非常高。 对于大约1.3密尔行的一个整数列,大约100 MB ram。
我的代码的示例部分(使用非自定义HYDRATE_ARRAY):
function getResult() {
$rsm = new ResultSetMapping;
$q = $this->getEntityManager()->
createNativeQuery("select {$this->getTableIdColName()}
from {$this->getTableName()}", $rsm);
return $q->iterate(null, \Doctrine\ORM\Query::HYDRATE_ARRAY);
}
在调用所述函数时,即使我根本不迭代它 - 也会占用内存。 我还制作了一个自定义水合器,几乎和默认水分器一样,但使用的内存更少(因为它没有映射列名)。但结果并不好。
我是否遗漏了某些内容,或者查询在没有使用结果的情况下获取100 MB内存是否正常?
答案 0 :(得分:0)
问题在于查询缓冲,对于任何感兴趣的人:
http://php.net/manual/en/mysqlinfo.concepts.buffering.php
默认情况下,它已启用,因此整个结果将保留在内存中。
基本上这可以解决问题,但它会带来一些限制:
$em->getConnection()->getWrappedConnection()->setAttribute(\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);