ホームページ  >  記事  >  バックエンド開発  >  PHP 配列がメモリを大量に消費する場合はどうすればよいですか?

PHP 配列がメモリを大量に消費する場合はどうすればよいですか?

PHPz
PHPzオリジナル
2023-04-23 10:09:08733ブラウズ

PHP プログラミング言語を使用する過程で、一部のプログラムが大量のデータを処理するときにサーバー メモリの過剰使用を引き起こす場合があります。主な理由の 1 つは、PHP 配列が大量のメモリを消費することです。

PHP は、柔軟性があり、習得が簡単なプログラミング言語です。 PHP では、配列はサイズ変更が可能で、あらゆる種類の値を格納でき、キーによって各要素にアクセスできる強力なデータ構造です。 PHP 配列は非常に便利ですが、メモリの問題を引き起こす場合があります。

  1. PHP 配列の内部動作原理

PHP 配列はハッシュ テーブルを通じて実装されます。要素を配列に追加すると、PHP は要素のキーをハッシュしてハッシュ テーブルに格納し、要素の値をハッシュ テーブル内の対応するキーに格納します。配列要素にアクセスするとき、PHP は同じハッシュ関数を使用して、キー名のハッシュ値に一致する配列内のインデックスを検索し、要素の値を取得します。このようにして、配列要素にすばやくアクセスできます。

ただし、このアプローチの代償として、メモリ使用量が比較的多くなります。 PHP 配列は要素の値自体を保存する必要があるだけでなく、キー名と要素の対応するインデックスも保存する必要があります。大量のデータを処理する場合、これらの追加のメモリ オーバーヘッドにより、PHP の実行が遅くなったり、プログラムがクラッシュしたりする可能性があります。

  1. 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 以上のメモリを占有することになり、この数は要素の数が増加するにつれて増加します。

    PHP 配列メモリを最適化する方法
PHP 配列がメモリを大量に消費する問題を解決するには、次の方法を使用して最適化できます。

(1) SplFixedArray の使用

PHP の SplFixedArray は、通常の PHP 配列よりも使用するメモリが少ない固定サイズの配列実装ですが、特定の数の要素しか格納できません。この固定配列は、大量のデータを処理する必要がある場合に役立ちます。

次は SplFixedArray 実装のコード例です。前のプログラムと比較します:

$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 配列はハッシュ テーブルを使用して実装されるため、メモリの問題が発生する場合があります。大量のデータを処理する場合は、プログラムのメモリ消費の最適化を慎重に検討する必要があります。 SplFixedArray またはジェネレーター、および一連の最適化戦略を使用して、配列をより小さなセグメントに分割することにより、プログラムのメモリ使用量を制御し、プログラムのパフォーマンスを向上させることができます。

以上がPHP 配列がメモリを大量に消費する場合はどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。