Я изучал использование итераторов для пакетной обработки в Doctrine (http://docs.doctrine-project.org/en/2.0.x/reference/batch-processing.html). У меня есть база данных с 20 000 изображений, которые я бы хотел пропустить.
Я понимаю, что использование итератора должно предотвращать загрузку Doctrine каждой строки в памяти. Однако использование памяти между двумя примерами почти одинаково. Я вычисляю использование памяти до и после использования (memory_get_usage() / 1024)
.
$query = $this->em->createQuery('SELECT i FROM Acme\Entities\Image i');
$iterable = $query->iterate();
while (($image = $iterable->next()) !== false) {
// Do something here!
}
Использование памяти для итератора.
Memory usage before: 2823.36328125 KB
Memory usage after: 50965.3125 KB
Этот второй пример загружает весь набор результатов в память с помощью метода findAll
.
$images = $this->em->getRepository('Acme\Entities\Image')->findAll();
Использование памяти для findAll
.
Memory usage before: 2822.828125 KB
Memory usage after: 51329.03125 KB