Symfony2 - doctrine2批处理

rkm*_*max 8 batch-processing symfony doctrine-orm

我有以下情况:

我需要基于一对实体创建大量实体(实体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();
Run Code Online (Sandbox Code Playgroud)

我遵循doctrine2-batch-processing的指示

但是当我执行$em->detach($row[0]);并刷新获得错误时通过关系找到了一个新实体......

我试过没有,$em->detach($row[0]);但这种高内存消耗

我需要:是在使用后释放每个实体B的内存,但同时每次刷新或按组而不是一个一个,并清除所有实体C

Jak*_*las 1

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

$em->clear('EntityB'); 
$em->clear('EntityC');
Run Code Online (Sandbox Code Playgroud)

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

尝试删除clear()通话。您还可以尝试删除detach()呼叫并呼叫clear()选定的实体。