Anda melakukannya dengan benar -- ini hanya lambat, karena abstraksi ORM yang ditambahkan berarti Anda tidak dapat melakukan pengoptimalan yang diinginkan.
Konon, EntityManager menjadi lambat pada transaksi sebesar itu. Jika Anda tidak benar-benar membutuhkan semuanya dalam satu transaksi besar, Anda mungkin bisa mendapatkan lebih banyak kode yang berkinerja baik dengan menyiram() dan kemudian menghapus() EM setiap 20-200 iterasi dari loop Anda.
Jika itu tidak memberi Anda kinerja yang cukup, satu-satunya alternatif yang dapat saya pikirkan adalah kembali ke kode khusus yang menjalankan SQL khusus secara langsung terhadap DBMS Anda.
Saya tahu ini bukan jawaban yang bagus, tetapi setidaknya saya dapat memberi tahu Anda bahwa Anda tidak gila.
------ edit -------strong>
Dari artikel resmi Doctrine2 di Pemrosesan batch
:
Juga ada perbedaan kinerja yang signifikan saat menggunakan jarak jauh vs lokal database sebagai overhead pengiriman setiap query ke server jauh cukup besar. Overhead jauh lebih rendah saat menggunakan database lokal berkat transaksi dan pengoptimalan DB. (mis. 70 detik diturunkan menjadi 300 md dalam kasus contoh dalam pertanyaan)