0

私のアプリケーションで会社のエクスポート機能を高速化する最良の方法は何だろうと思っています。

function export(){
    ini_set('memory_limit', '-1');
    ini_set('max_execution_time', 0);

    $conditions = $this->getConditions($this->data);
    $resultCompanies = $this->Company->find('all', array('conditions' => $conditions));

    $this->set(compact('resultCompanies'));
}

つまり、特定の条件に一致するデータベース内の企業を検索します。次に、結果を対応するビューに表示できるように設定します。

この関数を高速化するにはどうすればよいですか? エクスポートする結果が多いほど、エクスポートに時間がかかりますが、何らかの方法で最適化することはできますか? 現在、わずか 4000 件の結果をエクスポートするのに約 30 秒かかります。つまり、40000 件の結果をエクスポートできるとは思いません。サーバーの問題でしょうか?

ありがとう。

4

1 に答える 1

1

これはサーバーの問題ではなく、プログラムのアーキテクチャの問題です。

すでに遭遇した明白な理由により、この膨大な量の情報をオンザフライで取得してレンダリングしたくはありません。

アプリの要件についてはよくわかりませんが、レポートをダウンロードする必要があると思います。ここで常に最新である必要があると仮定すると、私は次のようにします。

ユーザーはリンクをクリックして、レポートをダウンロードします。ユーザーには読み込みインジケータが表示され、JS と AJAX を使用してレポートのエクスポートが準備されているというメッセージが表示されます。サーバー側では、レポートを作成するタスクがトリガーされます。

ループで実行される単純な CakePHP シェルであるバックグラウンド サービスは、作成する新しいレポートがあることを認識します。メモリ不足を回避し、ファイルに書き込むために、db レコードをチャンクで読み取るレポートを作成します。完了すると、レポートのダウンロード リクエストに完了のフラグが付けられ、ファイルをダウンロードできるようになります。クライアント側では、ロング ポーリング JS スクリプトがファイルの準備ができていることを認識し、ダウンロードします。

別の解決策は、データが最新である必要がないことを前提として、たとえばレポート ファイルを 1 日に 1 回生成し、ユーザーを待たずにダウンロードできるようにすることです。サーバー側では、タスクは同じままです。データをチャンクで読み書きします。

質問のパフォーマンス部分について:

これにより速度が向上するわけではありませんが、ユーザーにフィードバックが提供されます。既に処理されたチャンクに基づいて残りの時間を計算 (推定) することもでき、さらに、メモリ不足によるスクリプトのクラッシュを防ぐことができます。ファイルをディスクに書き込む代わりに、クライアントに直接ストリーミングできます。最初のチャンクの読み取りが開始されるとすぐに、データの送信が開始されます。しかし、データベースからデータを読み取るには...お金とハードウェアをそれに投入します。お金があれば、SSD を使用した RAID5 アレイのようなものをお勧めします。それに数千ドルを投入することを期待してください。

しかし、最速の DB 読み取りでさえ、送信できる帯域幅とユーザーが受信できる帯域幅によって制限されます。DB の高速化については、superuser.com で質問することをお勧めします。私は DB ハードウェアの専門家ではありませんが、適切にセットアップされた SSD 構成により、DB の速度が大幅に向上します。

必要なデータのみをフェッチします。

検索結果に、contain() や再帰的な設定が見当たりません。レポートで本当に必要なデータのみを取得するようにしてください。

于 2013-08-13T13:39:07.563 に答える