ho la seguente situazione:Symfony2 - Doctrine2 elaborazione batch
Ho bisogno di creare un gran numero di entità (Entity C) sulla base di una coppia di entità
- entità A (45)
- entità B (700000+)
- Entity C (45 x 700000)
- Entity D
Così ho deciso di fare quanto segue:
$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();
seguo istruzioni da doctrine2-batch-processing
ma quando eseguo $em->detach($row[0]);
e filo ottiene un errore Una nuova entità è stata trovata attraverso il rapporto ...
Ho provato senza $em->detach($row[0]);
ma questo consumo di memoria elevato
Ho bisogno di: è per liberare la memoria o f ogni Entità B, dopo l'uso, ma allo stesso tempo ogni colore o per gruppi e non uno per uno, e deselezionare tutte le Entità C
Non è necessario scollegare il soggetto, come si regolarmente svuotare l'entity manager. – Herzult
questo lavoro bene se eseguire '$ batchSize = 50', ma IsNot un buon numero per me – rkmax
È perché si scollega il tuo entità prima del lavaggio quindi è considerato come una nuova entità da parte del gestore di entità ... – Herzult