我有以下情况:
我需要基于一对实体(Entity A和Entity B)创建大量实体(Entity C)。
- Entity A(45) - Entity B(700000+) - Entity C(45 x 700000) - Entity D
因此,我决定采取以下措施:
我需要基于一对实体(Entity A和Entity B)创建大量实体(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。
$batchSize=50
时可以正常工作,但对我来说不是一个好的数字。 - rkmax