Symfony2 - пакетная обработка doctrine2

У меня следующая ситуация:

Мне нужно создать большое количество объектов (Entity C) на основе пары объектов

  • Entity A (45)
  • Entity B (700000 +)
  • Entity C (45 x 700000)
  • Entity D

Поэтому я решил сделать следующее:

$AEntities = $em->getRepository('MyBundle:EntityA')->findAll();
$DEntity = $em->getRepository('MyBundle:EntityD')->findOneBy($params);

$iterableResult = $em->getRepository('MyBundle:EntityB')
                ->createQueryBuilder('b')
                ->getQuery()->iterate();
$batchSize = 50

while (($row = $iterableResult->next()) !== false) {
  foreach($AEntities as $AEntity) {
    $entity = new Entity\EntityC();
    $entity->setEntityD($DEntity);
    $entity->setEntityB($row[0]);
    $entity->setEntityA($AEntity);
    $em->persist($entity);
  }

  if(($i % $batchSize) == 0){
    $em->flush();
    $em->clear();
  }
  $em->detach($row[0]);
  $i++;
}

$em->flush();

Я следую инструкциям из doctrine2-batch-processing

, но когда я выполняю $ em-> detach ($ row [0]); и flush получают сообщение об ошибке Новый объект был найден через связь ...

Я пробовал без $ em-> detach ($ row [ 0]); но это высокое потребление памяти

мне нужно : чтобы освободить память каждого объекта B после использования, но в то же время каждый сброс или по группам, а не один за другим, и очистить всю сущность C

8
задан rkmax 19 December 2011 в 19:28
поделиться