1

私はDatamapperを使用して、基本的に1つのデータベース内の一連の生データをより正規化されたデータベースに同期しています。私はすでに2セットのモデルをセットアップしました。1つはデータベースごとに1つで、どちらもDMを拡張しています。私が直面している問題は、ギグに相当するデータを新しいデータベースにインポートする必要があることです。コントローラーで新しいDMオブジェクトを作成しているとき、作成しているメソッドを返しても解放されないようです。モデルは関係を自動ロードしません。

$clients = $this->client->get_iterated();
foreach($clients as $client) {
  $this->addUser($client);
}

addUser()で、新しいUserオブジェクトを作成し、保存して戻ります。これのメモリ使用量を出力すると、すべてが使い果たされるまで増加します。最初は、PHPがaddUser()に渡される$ clientオブジェクトのコピーを作成していたためだと思いましたが、addUser()の最初の行に「return」を入れるだけではメモリの増加は見られません。新しいUserオブジェクトを作成して保存したときだけです。

メソッドが終了する前に$user->clear()を使用してみましたが、役に立ちませんでした。

アプリケーションが元々rawデータベースモデルで問題なく実行されていたことは注目に値します。新しいモデルが作成され、保存された後、解放されることはありません。これは文字通り数分で2ギガのメモリをかみ砕きます。

4

1 に答える 1

1

私もこの問題を抱えており、デバッグに何時間も費やしました。私たちが見つけた唯一の回避策は、次のような多くのインスタンスを作成する操作のために、モデルでシングルトン インスタンスを使用することに頼ることでした。

static function get_utility_instance() {
    if ( !self::$utility_instance ) {
        self::$utility_instance = new User_model() ;
    }
    self::$utility_instance->clear() ;
    return self::$utility_instance ;
}
于 2013-03-19T22:19:19.537 に答える