PHP プログラミング言語を使用する過程で、一部のプログラムが大量のデータを処理するときにサーバー メモリの過剰使用を引き起こす場合があります。主な理由の 1 つは、PHP 配列が大量のメモリを消費することです。
PHP は、柔軟性があり、習得が簡単なプログラミング言語です。 PHP では、配列はサイズ変更が可能で、あらゆる種類の値を格納でき、キーによって各要素にアクセスできる強力なデータ構造です。 PHP 配列は非常に便利ですが、メモリの問題を引き起こす場合があります。
PHP 配列はハッシュ テーブルを通じて実装されます。要素を配列に追加すると、PHP は要素のキーをハッシュしてハッシュ テーブルに格納し、要素の値をハッシュ テーブル内の対応するキーに格納します。配列要素にアクセスするとき、PHP は同じハッシュ関数を使用して、キー名のハッシュ値に一致する配列内のインデックスを検索し、要素の値を取得します。このようにして、配列要素にすばやくアクセスできます。
ただし、このアプローチの代償として、メモリ使用量が比較的多くなります。 PHP 配列は要素の値自体を保存する必要があるだけでなく、キー名と要素の対応するインデックスも保存する必要があります。大量のデータを処理する場合、これらの追加のメモリ オーバーヘッドにより、PHP の実行が遅くなったり、プログラムがクラッシュしたりする可能性があります。
プログラム内で PHP 配列によって占有されるメモリをより詳しく説明するために、次のテスト プログラムを実行できます。
$startMemory = memory_get_usage(); $array = []; for($i = 0; $i < 1000000; $i++){ $array[] = $i; } $endMemory = memory_get_usage(); echo "Memory used: " . ($endMemory - $startMemory)/1024/1024 . " MB";上記のプログラムは空の配列を作成し、それに 100 万個の整数を追加します。すべての要素が追加された後、プログラムはプロセスによって使用されたメモリ量を出力します。私の MacBook Pro では、出力は次のようになります:
Memory used: 76 MBこれは、この小さなプログラムが 76MB のメモリ空間を占有していることを示しています。また、プログラムに追加する要素の数を 10000000 に増やすと、プログラムは実行後に 900MB 以上のメモリを占有することになり、この数は要素の数が増加するにつれて増加します。
$startMemory = memory_get_usage(); $array = new SplFixedArray(1000000); for($i = 0; $i < 1000000; $i++){ $array[$i] = $i; } $endMemory = memory_get_usage(); echo "Memory used: " . ($endMemory - $startMemory)/1024/1024 . " MB";出力結果は次のとおりです:
Memory used: 7.25 MBご覧のとおり、SplFixedArray を使用します。 、10 MB 未満のメモリ領域で同じタスクを完了しました。 (2) ジェネレーターを使用するジェネレーターは、PHP5.5 で導入された新しいデータ型で、すべての値をメモリに保存するのではなく、必要なときに値を生成できます。ジェネレーターを使用すると、メモリ使用量を大幅に削減できます。以下は、ジェネレーターを使用して実装されたコード例です。
$startMemory = memory_get_usage(); function generator($max){ for($i = 0; $i < $max; $i++){ yield $i; } } $array = generator(1000000); $endMemory = memory_get_usage(); echo "Memory used: " . ($endMemory - $startMemory)/1024/1024 . " MB";出力結果は次のとおりです。
Memory used: 0.25 MBジェネレーターを使用することにより、同じタスクを完了するのに使用したメモリ空間は 0.25MB のみでした。 (3) 要素をバッチで処理するSplFixedArray またはジェネレーターを使用してもニーズを満たせない場合は、配列要素をバッチで処理することを検討できます。 PHP 配列のメモリ消費量は、配列を多数の小さなセグメントに分割し、各データ セグメントを 1 つずつ処理することで削減できます。 array_chunk 関数を使用すると、配列を小さなセグメントに分割し、各データ セグメントを 1 つずつ処理できます。コード例を次に示します。
$startMemory = memory_get_usage(); $array = []; for($i = 0; $i < 1000000; $i++){ $array[] = $i; } $tempArrays = array_chunk($array, 10000); foreach($tempArrays as $tempArray){ //处理临时数组 } $endMemory = memory_get_usage(); echo "Memory used: " . ($endMemory - $startMemory)/1024/1024 . " MB";このメソッドを使用すると、プログラムが使用するメモリを制御しながら、大量のデータを処理する際のプログラムのパフォーマンスを向上させることができます。
以上がPHP 配列がメモリを大量に消費する場合はどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。