Symfony2 - doctrine2 пакетная обработка - PullRequest
8 голосов
/ 17 декабря 2011

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

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

  • Сущность A (45)
  • Сущность B (700000 +)
  • Объект C (45 x 700000)
  • Сущность 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]); и сбрасываю, получаю ошибку. В связи с этим была обнаружена новая сущность ...

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

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

Ответы [ 2 ]

1 голос
/ 07 июля 2014

Вы должны полностью указать имя сущности

$em->clear('Acme\MyBundle\Entity\EntityB');
$em->clear('Acme\MyBundle\Entity\EntityC');
1 голос
/ 19 декабря 2011

Вызов clear () в диспетчере сущностей отключает ВСЕ объекты (по умолчанию). Кстати, вы можете передать имя сущности для отсоединения сущностей данного типа:

$em->clear('EntityB'); 
$em->clear('EntityC');

Я думаю, что вы пытаетесь отделить уже отсоединенную сущность, и поэтому она рассматривается как новая.

Попробуйте удалить clear() вызов. Вы также можете попробовать удалить detach() call и call clear() на выбранных объектах.

...