0

私の質問は、大量のデータを繰り返し使用することに関するものです。

単一のphpページの実行中に繰り返し相互参照する必要がある約50MBのデータがあります。このタスクは、テーブル結合で SQL クエリを使用することによって最も簡単に解決できます。問題は、非常に短い時間で処理する必要がある大量のデータと、それを行うために必要なクエリの数です。

私が現在行っているのは、各テーブルの関連部分 (通常は 30% または 10,000 行を超える) を配列にダンプしてループすることです。テーブルの結合は常に 1 つのフィールドで行われるため、関連する行を識別するために、並べ替えの非常に基本的な「インデックス」を作成しました。

システムは動作します。私のプロダクション環境で 1 年以上使用されていますが、今はさらにパフォーマンスを絞り込もうとしています。私がプロファイリングしている特定のページで、2 番目に長い合計時間は、これらの配列をループする増分行に起因します。ヒット数は 130 万で、合計実行時間は 30 秒です。これは、同じ結果を得るために約 8200 回の SQL クエリによって実行されたであろう作業を表しています。

私が探しているのは、このような状況を経験した他の人です。私は、PHP で処理する必要のある大量のデータを持っている最初の人に近いとは信じられません。

ありがとう!


ここでアドバイスをくださった皆様、本当にありがとうございました。私が望んでいたように、ここには本当にわずかな弾丸がないようです。私が最終的にやろうとしているのは、mysqlメモリテーブルとページ化されたmemcacheのいくつかのバージョンを組み合わせて使用​​ することだと思います.

4

2 に答える 2

1

この解決策は、データで何をしているかに大きく依存しますが、列に特定の値が与えられた行を検索しようとしているときに、配列キー内で一意の値の列を操作すると、処理が大幅に高速化されることがわかりました。これは、php がハッシュ テーブルを使用して高速検索用のキーを格納するためです。配列を反復処理したり、array_search を使用したりするよりも数百倍高速です。しかし、コード例を見ずに言うのは難しいです.

コメントから追加:

次のステップは、メモリ データベースを使用することです。mysqlまたはSQLiteでメモリ テーブルを使用できます。また、制御する実行環境の量にも依存します。これらのメソッドは、共有ホスティング プロバイダーが通常許可するよりも多くのメモリを必要とするためです。グループ化、ソート、集約関数などにより、おそらくコードも簡素化されます。

于 2012-12-07T18:46:42.233 に答える
1

さて、私は処理する大量のデータがあり、MySQL クエリを介してできるだけ多くのことを試みるか、PHP にオフロードするという同様の状況を見ています。

これまでのところ、私の経験は次のとおりです。

  1. PHP は、MySQL クエリを使用するよりもはるかに低速です。

  2. 呼び出し間の待ち時間が厳しいため、MySQL クエリの速度は、ロジックを 1 回の呼び出しに詰め込んだ場合にのみ許容されます。

私は特に、少量のデータをループする場合でも PHP の処理速度が遅いことにショックを受けています。私は何か間違ったことをしているのではないかと考え続けています/望んでいます...

于 2012-12-07T18:29:15.590 に答える