2

$modelName->find(...) 呼び出しで CakePHP を使用して、かなりの数の行 (数百になる可能性があります) を選択しています。

通常、PHP/MySQL ではもちろんこれは問題になりません。while ループでフェッチするからです。しかし、CakePHP はすべての行を配列にロードし、メモリ制限を使い果たします。

$modelName->find(...) コンストラクトを使用する方法はありますが、必要に応じて各行をフェッチするイテレータを返しますか?

ありがとう、デビッド

4

11 に答える 11

4

モデルの関係が問題の原因である場合は、次の方法で再帰を減らすことができます。

$modelname->recursive = -1;

次に、現在のモデルのデータのみを取得し、関係はありません。

すべてのレコードを反復処理すると、再帰 > 0 で再度クエリを実行して、それらの関係を 1 つずつ取得できます。

于 2009-11-03T20:52:54.287 に答える
4

テーブルを一度に数行ずつ処理するために使用できるコードを次に示します。

    $limit = 10;
    $loop_no = 0;
    do {
        $handles = $this->SocialChannelHandle->find('all', array(
            'fields' => array('brand_id', 'handle'),
            'conditions' => array('social_channel_id' => $facebook['SocialChannel']['id']),
            'limit'  => $limit,
            'offset' => $limit * $loop_no,
            'order'  => 'id asc',
            'recursive' => -1)
        );
        $loop_no++;
    } while (count($handles) == $limit);
于 2012-12-08T20:51:04.153 に答える
0

また、モデルの関係のために非常に多くのデータを取得している可能性もあります。あなたの someModel->find() 呼び出しについて、someModel に関連する他のモデルはいくつありますか?

一般的な共有ホスティング サーバーの配列で少なくとも 1000 行を使用しましたが、メモリの問題はありませんでした。

更新: 関連するモデルを返したくない場合は、単純に Containable 動作を使用できます。したがって、すべての投稿を見つけようとしているがコメントは必要ない場合は、 $this->Post->contain() 構文を使用して、投稿レコードのみを返すことができます。Containable は、$actAs パラメータ $actAs = array('Containable'); を使用してモデルに追加する必要がある動作です。

于 2009-02-11T22:13:41.590 に答える
0

検索条件に制限を追加できます。今は完全な回答を書く時間がありません。後で更新します。

いいえ、私が知っていることから、mysqlまたは通常のドライバーでリクエストを行う場合。とにかく、選択したすべての要素を返します。したがって、メモリ制限に問題がある場合は、別の場所にある可能性があります。特定の行数に制限を追加できます。テーブルに複数の依存関係があるが、すべての外部キーをロードする必要がない場合は、「contains」属性を使用して必要なものだけをロードできます。

テーブルの説明を教えてください。そして何を選びたいか。

于 2009-02-16T20:14:41.697 に答える
0

検索条件から返された反復子を探していることは理解していますが、LIMIT 句を可変オフセット (たとえば、一度に返したい行の数) とともに使用するのはどうでしょうか? これにより同時実行性の問題が発生する可能性がありますが、ORDER BY id 句も含めると、返される行で一貫した動作が見られるはずです。次に、ループ内で find(...) クエリを繰り返し発行します。

これは明らかに、イテレータのように洗練されたソリューションではありませんが、より多くの行を返すリクエストを繰り返し発行するオーバーヘッドは、一度に複数の行を取得することによる節約とほぼ釣り合うと思います (Cake で)。 .

最後に、もしあなたが本当にパフォーマンスを求めているなら、CakePHP はお茶の袋ではないかもしれないと思います。新しいリリースで速度が向上していますが、パフォーマンスに関しては、他のフレームワークにかなり遅れをとっていると思います。

于 2009-02-11T22:22:22.833 に答える
0

CakePHP はデータベース エンティティの関係を表す多次元配列を動的に構築しているため、これは不可能だと思います。これは、CakePHP がすべての可能な関連エンティティを認識するために、すべてのクエリ行をフェッチした後に実行する必要があります。

例:

対応する多次元配列を構築するには、3 行をフェッチする必要があります。

第1条
  | |
  -- コメント 1
  | |
  -- コメント 2
  | |
  -- コメント 3

クエリ結果 (1..n):

記事 | コメント
-----------------
1 | 1
-----------------
1 | 2
-----------------
1 | 3
于 2009-02-11T22:24:08.600 に答える
0

再帰パラメーターを使用して find メソッドの呼び出しを制限するか ( Model#find の API )、その場でモデルの関連付けをバインド解除して、取得するデータの量を減らすことができます (その場での関連付けの作成と破棄) 。

于 2009-11-04T00:07:03.493 に答える
-1

Ruby On rails はこれをより適切に処理します。デフォルトの動作では、:include => :table_name を使用しない限り、他のテーブルを含めず、その場で結合を生成します。

これができない理由はありません。

于 2011-04-18T15:25:22.987 に答える