【Doctrine2】のメモリリークを回避する。

ループ処理などで大量のエンティティをpersist()させて最後にflush()みたいなことをするとメモリをバカ食いするのであまりよろしくない。
下記のようにclear()メソッドを実行してやるとEntityManagerの消費メモリが解放されるので定期的にこの処理を挟むべき。

$em->persist($entity);
$em->clear();

それでもメモリの使用量が思ったように下がってくれない場合はEntityManagerのSQLロガーが原因なので、ログの出力をオフにしてやるとよい。

$em->getConnection()->getConfiguration()->setSQLLogger(null);

これでかなりバッチのメモリ消費量が軽減された。