Как бороться с утечкой памяти при экспорте данных?

Делаю экспорт в CSV относительно dataProvider. Но получается, что в какой-то момент на сложной view (более 10 join) падает с ошибкой о нехватке памяти PDO.

Код:

private function writeContentRowsQuery() {
	$offset = 0;
	
	while ($queryResult = $this->dataProvider->query->limit($this->_settings['limit'])->offset($offset)->createCommand()->queryAll()) {
		foreach ($queryResult as $row) {
			$rowData = [];
			
			foreach ($this->_visibleColumns as $visibleColumn) {
				$rowData[] = $this->getDataCellQueryValue($visibleColumn, $row);
			}
			
			fputcsv($this->_csv, $rowData, ';');
			ob_flush();
			flush();
			
			unset($rowData);
			gc_collect_cycles();
		}
		
		$offset += $this->_settings['limit'];
		
		unset($queryResult);
		gc_collect_cycles();
	}
	
	gc_collect_cycles();
}

Здесь идет инициализация процесса так:

ob_start();
$this->_csv = fopen('php://output', 'wb');

if (!empty($this->contentBefore)) {
	$this->writeBeforeContentRows();
}

$this->writeColumnHeaders();
$this->writeContentRowsQuery();
fclose($this->_csv);

Что делать в таком случае?

Ошибки:
PDOException: SQLSTATE[54000]: Program limit exceeded: 7 ОШИБКА: нехватка памяти
DETAIL: Не удалось увеличить строковый буфер

Орет на строки:

  1. ob_flush(); о том, что Headers already sent
  2. while ($queryResult = $this->dataProvider->query->limit($this->_settings['limit'])->offset($offset)->createCommand()->queryAll()) о нехватке памяти
  1. Выбирать пачками по 100 штук через LIMIT, OFFSET.
  2. Выключить буфер в PDO и использовать курсор.

По первому пункту есть, буфер выключал там по совету но не очень помогло. batch вообще положил все… Получается, что у меня идет выборка 5700 значений, потом все зависает и вылетает ошибка PDO о нехватке памяти…
Если есть возможность, то можно как-то связаться с вами, чтобы проконсультироваться, ибо уже над этим долго работаю и не понимаю.
memory_get_usage всегда меньше чем лимит.

5700 значений за одни раз конечно не влезет. Выбирайте по 100-200, обрабатывайте, выбарайте следующие 100-200.

Нет, вы не поняли. У меня стоит limit 100 и offset 100. Далее я сделал batch(10):
$this->dataProvider->query->limit(100)->offset(0)->batch(10) и все равно умирать стал на 5000 или 5700 записей, которые уже записал в файл.
Причем ошибка выдается не по php, а именно как pdo. Мол у него что-то не хватает. То есть алгоритм простой: делаем лимит и офсет + батч 10, в конце цикла делаем другой офсет и удаляем все переменные + ob_flush и flush (чтобы отдать сразу юзеру файл). Порционное скачивание идет, но по сути как-то захламляется PDO…

foreach ($queryResult as $row) {

use while

while($row = array_shift($data)){

}

Nope, there are same errors

Странно. Такого быть не должно и сам я не встречал…

Может быть посмотреть в сторону генераторов? Они же вроде как работают с большими объемами и не хранят их в памяти.

Если у вас источник ошибки PDO, то не поможет.

Ошибка оказалась не в коде, а в БД… Что-то там с VIEW не так именно с 5000 и далее записями