1

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の関係(自己参照)が問題になる可能性があると述べましたか?しかし、この関係を削除しても解決しません。

質問: どうすればそれを管理できますか?テーブル内の最も古いエントリのみを更新する必要があります。

4

1 に答える 1

0

ああ、/app/logs/dev.log を見て、ステートメント sql を実行しました。私が見つけたのは、最初の行(名前の列)にいくつかの中国語のサインでした。

エントリを削除しましたが、スクリプトは引き続き機能します...文字セットに問題があるようです。テーブルは utf8 です...データベース接続のどこでこの文字セットを変更する必要があるのだろうか?

于 2012-11-29T16:09:26.933 に答える