Sie machen es richtig – es ist nur langsam, weil die zusätzliche Abstraktion des ORM bedeutet, dass Sie nicht die gewünschten Optimierungen vornehmen können.
Allerdings wird der EntityManager bei so großen Transaktionen langsam. Wenn Sie sie nicht unbedingt alle in einer großen Transaktion benötigen, können Sie wahrscheinlich leistungsfähigeren Code erhalten, indem Sie den EM alle 20-200 Iterationen Ihrer Schleife leeren und dann löschen.
Wenn Ihnen das nicht genug Leistung bringt, ist die einzige Alternative, die mir einfällt, die Rückkehr zu benutzerdefiniertem Code, der benutzerdefiniertes SQL direkt auf Ihrem DBMS ausführt.
Ich weiß, das ist keine gute Antwort, aber zumindest kann ich dir sagen, dass du nicht verrückt bist.
------ bearbeiten ------
Aus dem offiziellen Doctrine2-Artikel auf Stapelverarbeitung
:
Außerdem gibt es einen signifikanten Leistungsunterschied bei der Verwendung von remote vs. local Datenbank, da der Aufwand für das Senden jeder Abfrage an den Remote-Server ziemlich groß ist. Der Overhead ist bei Verwendung der lokalen Datenbank dank Transaktionen und DB-Optimierungen viel geringer. (z. B. 70 Sekunden im Fall des Beispiels in der Frage auf 300 ms gesenkt)