2011-12-16 10 views
8

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

+1

Non è necessario scollegare il soggetto, come si regolarmente svuotare l'entity manager. – Herzult

+0

questo lavoro bene se eseguire '$ batchSize = 50', ma IsNot un buon numero per me – rkmax

+0

È perché si scollega il tuo entità prima del lavaggio quindi è considerato come una nuova entità da parte del gestore di entità ... – Herzult

risposta

1

Chiamare clear() on entity manager scollegare TUTTI gli oggetti (per impostazione predefinita). Btw, è possibile passare nome dell'entità di staccare entità del dato tipo:

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

Penso che si sta cercando di staccare entità già staccato e quindi è trattata come nuovo.

provare a rimuovere clear() chiamata. Si potrebbe anche provare a rimuovere detach() chiamata e chiamare clear() sulle entità selezionate.

+0

ottengo' [Doctrine \ ORM \ ORMException] EntityManager # chiaro ($ entityName) non ancora implemented.' – rkmax

+0

sembra di essere implementato nel ramo principale di Doctrine2: https://github.com/doctrine/doctrine2 – AlterPHP

+0

ho installato '2.1.4' è l'ultimo incluso in 'Symfony 2.0.7' – rkmax

1

È necessario specificare il nome dell'entità pienamente

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