Следующий код выполняет итерацию по таблице, которая имеет ~ 1,000,000 строк. Мне было рекомендовано использовать метод iterateResult () Doctrine, чтобы избежать проблем с памятью ( docs ):
$batchSize = 1000; $i = 0; $q = $em->createQuery('SELECT i from MyBundle:Items i WHERE i.imgSize IS NULL'); $results = array(); $iterableResult = $q->iterate(); while (($row = $iterableResult->next()) !== false) { $results[]=$row[0]; $em->detach($row[0]); if (($i % $batchSize) === 0) { $em->clear(); // allegedly detaches all objects from Doctrine! $this->chunkedWhereCallback($results); } ++$i; }
Вышеприведенный код превышает допустимую память, даже если я задал размер партии SELECT i.id, i.img FROM MyBundle:Items i WHERE i.imgSize IS NULL
1. Если я изменил запрос на чтение SELECT i.id, i.img FROM MyBundle:Items i WHERE i.imgSize IS NULL
тогда ошибки памяти отсутствуют, но затем В моем массиве $ row нет ключа [0], например:
array(1) { [5926] => array(2) { 'id' => int(12794) 'img' => string(57) "http://img.ruphp.com/doctrine2/104962420.jpg" } }
Может ли кто-нибудь сказать мне, что мне здесь не хватает? Larvel's Eloquent отлично справился с этой операцией, но я хотел передать код в Doctrine / Symfony2. Я попытался установить ограничение памяти php на 1024 М, которое должно быть более чем достаточно и больше, чем я имею на сервере.
Memory error is Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 32 bytes) in /Users/mre/Sites/ site/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php on line 699