Symfony2 - doctrine2批处理

时间:2011-12-16 22:03:43

标签: symfony doctrine-orm batch-processing

我有以下情况:

我需要基于一对实体

创建大量实体(实体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 个答案:

答案 0 :(得分:1)

调用clear() on entity manager分离所有对象(默认情况下)。顺便说一下,你可以传递实体名称来分离给定类型的实体:

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

我认为你试图分离已经分离的实体,因此它被视为新的。

尝试删除clear()电话。您也可以尝试删除detach()来电并在所选实体上致电clear()

答案 1 :(得分:1)

您必须完全指定实体名称

$em->clear('Acme\MyBundle\Entity\EntityB');
$em->clear('Acme\MyBundle\Entity\EntityC');