我有一个像这样的基本代码集(在控制器内):
$sql = 'select * from someLargeTable limit 1000';
$em = $this->getDoctrine()->getManager();
$conn = $em->getConnection();
$statement = $conn->prepare($sql);
$statement->execute();
我的困难是,当结果集只有几条记录时,内存使用情况还不错。我在运行$statement->execute();之前和之后回显了一些调试信息;部分代码,并为我的实现发现我有以下内容:
pre-execute... rowCount :: 0 memory: 49.614 MB
post-execute... rowCount :: 1000 memory: 50.917 MB
当从 1000 条记录上移到 10k 时,MB 使用量的差异增长到 13 MB
pre-execute... rowCount :: 0 memory: 49.614 MB
post-execute... rowCount :: 10000 memory: 62.521 MB
最终,检索大约 50k 条记录时,我接近了我的最大内存分配:
pre-execute... rowCount :: 0 memory: 49.614 MB
post-execute... rowCount :: 50000 memory: 114.096 MB
有了这个实现,我就无法编写一个控制器(甚至是命令)来让我检索 CSV 数据。当然,50k+ 条目听起来很多,问题是为什么,但这不是问题。
我的最终问题是:是否可以告诉 DBAL/Connection 或 DBAL/Statement 在执行时缓冲 SQL 中的数据而不是整个 PHP 中的数据。例如,如果我有 1000 万行,只将前 10k 行发送到 PHP...让我通过@statement->fetch();来查看它们。当光标到达 10k 的末尾时,截断数组并从数据库中获取下一个 10k?