Symfony2 / Doctrine делают $ Statement-> execute () не «буферизуют» все значения

У меня есть базовый набор кодов, как это (внутри контроллера):

$sql = 'select * from someLargeTable limit 1000';
$em = $this->getDoctrine()->getManager();
$conn = $em->getConnection();
$statement = $conn->prepare($sql);
$statement->execute();

Моя трудность заключается в том, что когда в наборе результатов только несколько записей, использование памяти не так уж плохо. Я повторил некоторую отладочную информацию до и после запуска$ Оператор-> Execute (); часть кода, и нашел для моей реализации, что у меня есть следующее:

pre-execute... rowCount :: 0 memory: 49.614 MB
post-execute... rowCount :: 1000 memory: 50.917 MB

При увеличении этого показателя с 1000 записей до 10 Кб разница в использовании МБ увеличивается до 13 МБ.

pre-execute... rowCount :: 0 memory: 49.614 MB
post-execute... rowCount :: 10000 memory: 62.521 MB

В конце концов, извлекая около 50 тыс. Записей, я получаю почти максимальное выделение памяти:

pre-execute... rowCount :: 0 memory: 49.614 MB
post-execute... rowCount :: 50000 memory: 114.096 MB

В этой реализации я не смог бы написать контроллер (или даже команду), который позволил бы мне получать CSV-данные. Конечно, 50k + записи звучат очень много, и возникает вопрос, почему, но это не проблема.

Мой окончательный вопрос: можно ли сказать, что DBAL / Connection или DBAL / Statement при выполнении буферизуют данные внутри SQL, а не в PHP в целом. Например, если у меня есть 10 миллионов строк, чтобы отправить в PHP только первые, скажем, 10k строк ... позвольте мне просмотреть их в порядке@ Оператор-> выборки (); а когда курсор доходит до конца 10к, укоротить массив и извлечь следующие 10к из БД?

Ответы на вопрос(4)

Ваш ответ на вопрос