PHP における巨大なデータ オブジェクトのメモリ オーバーヘッドに関する研究
まず誤解しないでいただきたいのですが、私はこの問題に関する研究結果を公開していませんが、この問題の分析と研究に協力していただきたいと思っています。 :)
問題の背景を簡略化して説明します。PHP で実装された Web サイトでは、すべてのプログラム ファイルの先頭に共通ファイル common.php が含まれます。現在、ビジネス上のニーズにより、 $huge_array = array(1,2,3,...,500000) のように、「巨大な」データ オブジェクト (約 500k の int 値を含む配列オブジェクト) が common.php で定義されています。システム全体で $huge_array への「読み取り」アクセスのみが存在します。システムは 100 の同時リクエストで安定して実行し続ける必要があると仮定します。
質問 1: $huge_array は common.php ソース ファイルで約 10M を占有し (当面は問題ありません)、メモリにロードされると 4M を占有する可能性があります (単なる推定です。サイズを正確に測定することは、この記事で議論する点ではありません)。問題は、PHP 自体が HTTP リクエストを処理するたびに独立したプロセス (またはスレッド) を開始するため、この約 4M のメモリ ブロックをメモリに再ロードする必要があるということです。メモリを共有できない場合、同時に 400M 近くの物理メモリを占有する可能性があり、メモリ使用量とメモリ アクセス効率の点で非常に不利になります。
質問 2: 特定のキャッシュ メカニズム (APC、XCache など) が有効になっている場合、そのようなキャッシュ メカニズムにはオペコードをキャッシュする機能があることがわかっていますが、スクリプトのコンパイル プロセスが短縮されるだけのようです。反復的な作業の場合、共有メモリは実行時の変数の読み込みにも役割を果たすことができますか?結局のところ、これらの多くの int 値はオペコードの一部としても存在する必要があるため、それが特定の役割を果たすことを願っています。
質問 3: 上記の XCache によるオペコードのキャッシュが目的を達成できない場合、XCache を直接操作しても効果はありますか?つまり、$huge_array は common.php に記述されるのではなく、キャッシュ エンジンに記述されます。
この記事の目的は、分析と調査を通じて、この使用法がメモリ使用量のボトルネックを引き起こすかどうか、および問題がある場合はそれを最適化する方法を判断することです。もちろん、巨大なデータ オブジェクト自体のサイズを削減するためにあらゆる手段を試すことが最初に考慮すべき最も重要なことですが、データ構造とアルゴリズムについてはこの記事では説明しません。コードを書く時間がない場合は、ソリューションが合理的である限り、この問題に関する独自の分析や見解を表明することができます。 , テストコードを書いてみたいと思います^_^
。
―――――――――――――――――――――――――――――――――
CSDN フォーラムが提供するプラグイン拡張機能をベースに、署名ファイル ツールを作成し、皆さんと共有しました。技術的な交流は歓迎です :)