пятница, 4 июня 2010 г.

Обрабатываем большую коллекцию по частям

Не секрет, что гидрация в объекты большого количества записей занимает много ресурсов (времени). Поэтому если вам надо вытащить Доктриной большое количество записей, и обработать их, то первый шаг к оптимизации - вытаскивать коллекцию не всю сразу, а кусочками. Примерно вот так:

<?php
$offset=0;
$count=10;

$q=Doctrine_Query::create()
  ->from('sfGuardUser u');
  
while (1)
{
  $q->limit($count)->offset($offset);
  
  $users=$q->execute();
  if (!$users->count())
    break;
    
  //Работаем с коллекцией $users
  
  //Освобождаем память. Это важно!
  $users->free();
  unset($users);
}
?>

2 комментария:

  1. Хмм и так разве работает? надо попробывать!

    ОтветитьУдалить
  2. Забыл инкремент $offset в коде:

    $offset += $count;

    ОтветитьУдалить