http://docs.doctrine-project.org/en/2.0.x/reference/batch-processing.html#iterating-resultsに従って、一括更新スニペットを作成しようとしました。
フレームワークsymfony2を使用し、約100万行を繰り返して、「slug」列をgedmodoctrine2拡張で更新しようとしています。
私が最終的に得たコード:
$this->container->get('profiler')->disable(); // should disable logging and profiler
$batchSize = 20;
$i = 0;
$q = $em->createQuery('select a from ACMEArtistBundle:Artist a order by a.touch ASC')
->setMaxResults(40); // a.touch is a DateTime Column
$q->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true); // some tipp i read somewhere
$iterableResult = $q->iterate();
while (($row = $iterableResult->next()) !== false) {
$row[0]->setSlug('');
if (($i % $batchSize) == 0) {
$em->flush(); // Executes all deletions.
$em->clear(); // Detaches all objects from Doctrine!
}
++$i;
}
256のメモリサイズでこのコードを実行すると、次のエラーが発生します:/ symfony2_installation / vendor / doctrine / orm / lib / Doctrine / ORM / Internal / Hydration / ArrayHydratorで許可されたメモリサイズ268435456バイトが使い果たされました(72バイトを割り当てようとしました) 230行目の.php
512のメモリサイズでこのコードを実行すると、空白の画面でこのエラーが発生します:324(net :: ERR_EMPTY_RESPONSE)
私のSQLで「orderbya.touchASC」を削除すると、一度に2000を超えるエントリでうまく機能することがわかりました。
#doctrineの1人の男は、1対1の関係(自己参照)が問題になる可能性があると述べましたか?しかし、この関係を削除しても解決しません。
質問: どうすればそれを管理できますか?テーブル内の最も古いエントリのみを更新する必要があります。