我有以下情况:

我需要基于一对实体创建大量实体(实体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

    最佳答案

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

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

    我认为您正在尝试分离已经分离的实体,因此将其视为新实体。

    尝试删除clear()调用。您也可以尝试删除detach()调用,然后在所选实体上调用clear()

    关于Symfony2-doctrine2批处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8540697/

    10-10 17:32