1

私はまだ Cake の一時的な使い方に問題があります。私はたくさんの脅威を読み、1000のことを試しましたが、実際には何も役に立ちませんでした. CakePHP 2.4.x を使用しています。MySQLdB の操作。データベースからログデータを選択する API を作成しました。何が私をそんなに混乱させているのかを説明するためにテストを行います。11列で1400行を返す選択があります。私の一般的なメモリ使用量 (memory_get_usage を使用) は約 4MB です。それを選択した後:

$condition = array('conditions'=> array(


    'LogBackend.created_at between ? AND ?' => array(
                                            $this->params['url']['from'],$this->params['url']['to']
                                       )));

    $this->data = $this->LogBackend->find('all', $condition).

メモリ使用量が 9MB を超えました。データの返却や作業はまだありません。選択するだけです。9MB はそれほど多くはありませんが、それ以上を選択すると、約 100k 行が可能になるはずです。256MB の容量が不足しています。そのばかげたメモリ使用量の理由を誰か教えてもらえますか?

よろしくお願いします

4

1 に答える 1

0

代わりに paginate を使用し、データをチャンクで処理します。Cake は、ビューに向かう 20 行ほどのチャンクを対象としています。しかし、何百万もの行に基づいてレポートを作成したいことがよくあります。CakePhp には paginate と呼ばれる関数があり、これをだまして mysql LIMIT 100000,1000 をかなり効率的に実行することができます。私はかなり熱心にグーグルでこれらのハックを見つけました.Cakephp 1.3にはわずかに異なる構文がいくつかあります.誰もCake 3に関する情報を投稿していない場合、それが変更された場合、私はおそらく戻ってきていつか投稿するでしょう.

// cakephp 2.4.1
$condition = array('conditions'=>
array('LogBackend.created_at between ? AND ?' =>
array($this->params['url']['from'],$this->params['url']['to'])));

$this->paginate['conditions'] = $conditions['conditions'];
$this->paginate['limit'] = 1000;
// could also use ['fields'] = array('filed1', 'field2'); to limit memory

/******* here is where we trick paginate to iter in the ctrlr *****/
$this->request->params['named']['page']=1;
$this->request->params['paging']['ModelName']['nextPage'] = true;
// get chunks
while ($this->request->params['paging']['ModelName']['nextPage']) {
    $Rows = $this->paginate("ModelName");
    // boil down this chunk of data 
    $this->request->params['named']['page']+=1;
}

何百万もの行をビューに戻すことは意味がありません。while ループは毎回 $Rows を上書きし、そのコア メモリを再利用します。したがって、課題は、データを抽出する賢い方法を見つけるか、ループ中に新しいテーブルを書き込んで、次の洗練のパスで使用することです。モデル処理のオーバーヘッドにより、Cakephp での実行はさらに遅くなります。そのため、不要な列が多数ある場合は、paginate['fields'] を使用して必要なフィールドのみを処理してください。フィールドは列と同じものです。

PHP は実際には哲学的に Apache に結び付けられているため、実際にはこの種のことを意図したものではありません。30 秒以内に結果を取得し、Web ページをレンダリングすることを目的としています。責任があるのはケーキだけではありません。Python と Ruby、さらには Perl の方が優れているかもしれません。しかし、ツールをふるいにかけて html にフォーマットしなければならないときは、赤ちゃんのように泣くでしょう。

于 2015-08-05T23:19:48.343 に答える