1

サンプルデータのデータベースを埋めるためにsymfonyタスクを作成しました。コードのサンプルは次のとおりです。

gc_enable();
Propel::disableInstancePooling();

public function test()
{
    for($i = 0; $i < 10000; $i++) {
        $this->doIt($i);
    }
}

public function doIt($i)
{
    $user = new User();
    $user->setUsername('user' . $i . "@example.com");
    $user->setPassword('test');
    $user->setFirstName('firstname' . $i);
    $user->setLastName('surname' . rand(0, 1000));

    $user->save();
    $user->clearAllReferences(true);
    $user = null;
    gc_collect_cycles();
}

どうすればメモリの使用を制限できますか?

4

3 に答える 3

3

これは最終的なコードです。同じメモリ使用量レベルで inf 時間動作する可能性があります。ありがとうございます。

public function test()
{
    for($i = 0; $i < 10000; $i++) {
        $this->doIt($i);
    }
}

public function doIt($i)
{
    gc_enable();
    Propel::disableInstancePooling();

    $user = new User();
    $user->setUsername('user' . $i . "@example.com");
    $user->setPassword('test');
    $user->setFirstName('firstname' . $i);
    $user->setLastName('surname' . rand(0, 1000));

    $user->save();
    $this->delete($user);
}

public function delete($obj)
{
    $obj->clearAllReferences(true);
    unset($obj);
    // redundant
    // gc_collect_cycles();
}
于 2012-07-05T16:42:48.353 に答える
0

symfony CLI タスクは、特に Windows 上で、大量の PHP メモリを必要とします。Propel タスクが失敗する場合、メモリ割り当ての php.ini ファイル設定を少なくとも 256M に永続的に変更することをお勧めします。これは高いように思えますが、これらのタスクは開発マシンでのみ必要になるはずです。

于 2012-07-04T16:48:14.213 に答える
0

SO の他のスレッドにいくつかの良いヒントがあります。

そして、これはpropel を使用したメモリ リークに関する非常に優れたブログ投稿です。フランス語ですが、とても興味深いです。

また、ビッグデータ (大量インポートなど) に取り組んでいる場合は、pcntl_fork も確認する必要があります (この要点を参照)。pcntl_fork は Windows では機能しません。この方法を使用して大量のインポートを処理しましたが、非常に高速で、メモリをすべて消費することはありません。

于 2012-07-05T07:19:59.977 に答える