Je doet het goed -- het is alleen traag, omdat de toegevoegde abstractie van de ORM betekent dat je niet het soort optimalisaties kunt maken dat je zou willen.
Dat gezegd hebbende, wordt de EntityManager traag bij zulke grote transacties. Als je ze niet allemaal nodig hebt in één grote transactie, kun je waarschijnlijk beter presterende code krijgen door de EM elke 20-200 herhalingen van je lus te flushen()en en vervolgens te wissen()en.
Als dat je niet genoeg prestaties oplevert, is het enige alternatief dat ik kan bedenken om terug te keren naar aangepaste code die aangepaste SQL rechtstreeks tegen je DBMS uitvoert.
Ik weet dat dit geen geweldig antwoord is, maar ik kan je tenminste vertellen dat je niet gek bent.
------ bewerken ------
Uit officieel Doctrine2-artikel over Batchverwerking
:
Er is ook een significant verschil in prestatie bij gebruik van remote vs local database aangezien de overhead voor het verzenden van elke query naar de externe server vrij groot is. De overhead is veel lager bij het gebruik van een lokale database dankzij transacties en DB-optimalisaties. (bijv. 70 sec verlaagd naar 300 ms in het geval van het voorbeeld in de vraag)