gpt4 book ai didi

php - Doctrine原生查询(createNativeQuery) select查询100万行高内存占用

转载 作者:行者123 更新时间:2023-11-29 22:07:20 24 4
gpt4 key购买 nike

我尝试使用 Doctrine 选择一百万行,但遇到了一些问题。

首先我尝试使用 ORM 查询来完成此操作,但后来我发现 native 查询更快。(我不需要为此使用 ORM 映射)。

我已经在使用数组水化器(创建对象是没有意义的,因为我只需要读取数据)。

我还听说过 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,但如果将其关闭,则会收到错误,因为我同时处理多个结果集(游标)。

所以内存使用率非常高。大约 100 MB 内存仅用于大约 130 万行的一个整数列。

我的代码示例部分(使用非自定义 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 的内存而不使用结果是否正常?

最佳答案

问题出在查询缓冲上,对于任何感兴趣的人来说:

http://php.net/manual/en/mysqlinfo.concepts.buffering.php

默认情况下,它是启用的,因此整个结果都保存在内存中。

基本上这解决了问题,但它带来了一些限制:

  1. 要求您在对数据库进行新查询之前使用/关闭所有结果(顺便说一下,doctrine 没有内部方法来关闭它们)

$em->getConnection()->getWrappedConnection()->setAttribute(\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

关于php - Doctrine原生查询(createNativeQuery) select查询100万行高内存占用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32028337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com