開発プロセス中に、大量のデータを処理する際に、大きな配列を複数の小さな配列に分割する必要があることがよくあります。 PHPは、配列セグメンテーションに非常に便利な関数Array_Chunk()を提供します。この関数は、大きな配列を複数の小さなアレイに分割できます。これは、ページネーション、バッチ処理などのさまざまなシナリオに適しています。Array_chunk ()は非常に便利ですが、大きな配列を扱う場合は最適化されていない場合はパフォーマンスボトルネックにつながる可能性があります。この記事では、array_chunk()を効率的に使用し、パフォーマンスの問題を回避する方法を探求する方法を紹介します。
array_chunk()関数は、配列を複数の小さな配列に分割し、小さな配列を含む2次元配列を返すために使用されます。
基本的な構文:
array_chunk(array $array, int $size, bool $preserve_keys = false): array
$配列:分割する必要がある配列。
$サイズ:各小さな配列のサイズ。
$ preserve_keys : Trueに設定されている場合、元の配列のキー名が保持されます。 falseの場合、キー名が再インド化されます。
サンプルコード:
<?php
$array = range(1, 20); // 含有します 1 到着 20 の配列
$chunked = array_chunk($array, 5);
print_r($chunked);
?>
出力結果:
Array
(
[0] => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )
[1] => Array ( [0] => 6 [1] => 7 [2] => 8 [3] => 9 [4] => 10 )
[2] => Array ( [0] => 11 [1] => 12 [2] => 13 [3] => 14 [4] => 15 )
[3] => Array ( [0] => 16 [1] => 17 [2] => 18 [3] => 19 [4] => 20 )
)
この方法は小さな配列に非常に効果的ですが、非常に大きな配列を扱っている場合、パフォーマンスの問題が徐々に現れます。
配列が非常に大きい場合、 array_chunk()を直接使用すると、過度のメモリ使用量が発生する可能性があり、パフォーマンスに影響します。主な理由は次のとおりです。
メモリフットプリント: array_chunk()複数の新しい配列コピーを作成します。これにより、メモリ使用量が急激に増加する可能性があります。
不要なキー名の再構成: $ preserve_keysパラメーターがfalseの場合、各小さな配列はキー名に再インドを再インドし、計算オーバーヘッドを追加します。
大きな配列の場合、パフォーマンスのボトルネックは最適化なしで特に顕著になり、プログラムのクラッシュや応答が遅いことさえあります。
パフォーマンスのボトルネックを避けるために、大きなアレイを扱う場合、次の最適化測定値をとることができます。
array_slice()関数は、配列全体をコピーすることなく、配列からサブアレイを抽出できます。 array_chunk()と比較して、 array_slice()を使用すると、必要に応じてアレイ内のデータの一部を処理でき、大規模な配列全体を一度に処理するメモリ使用量を回避できます。
最適化の例:
<?php
$array = range(1, 1000000); // 100万の要素が多数あるとします
$chunk_size = 10000; // 各処理 10000 要素
// 使用 array_slice 大きな配列を繰り返します
for ($i = 0; $i < count($array); $i += $chunk_size) {
$chunk = array_slice($array, $i, $chunk_size);
// 対処する $chunk データ,たとえば、送信 HTTP リクエストなど。
// リクエストを仮定します URL のために https://m66.net/api/data
file_get_contents("https://m66.net/api/data?data=" . urlencode(json_encode($chunk)));
}
?>
array_slice()を使用して大きな配列を通過する場合、固定サイズのデータの一部のみが一度に処理されます。これにより、メモリの使用量を効果的に削減し、一度に多くのデータをロードすることで生じるパフォーマンスの問題を回避できます。
前述のように、 array_chunk()のpreserve_keysパラメーターはメモリの使用に影響します。キー名を保持する必要がない場合は、メモリの使用量を減らすためにこのパラメーターをfalseに設定することをお勧めします。
<?php
$array = range(1, 1000000);
$chunked = array_chunk($array, 10000, false); // 元のキー名は保持されません
?>
そうすることで、各小さな配列のキー名が再インネックスされ、不要なメモリオーバーヘッドが減少します。
超大型アレイの場合、最良の方法はセグメントでそれらを処理することです。サイクルのバッチ内のデータを処理することにより、大きな配列を複数の小片に分割して1つずつ処理でき、それによりメモリ圧力が低下します。
バッチ処理の例:
<?php
$array = range(1, 1000000); // 大きな配列
$chunk_size = 50000; // 每批次対処する 50000 个データ
foreach (array_chunk($array, $chunk_size) as $chunk) {
// 逐批対処するデータ,たとえば、開始します API 聞く
file_get_contents("https://m66.net/api/data?data=" . urlencode(json_encode($chunk)));
}
?>
この方法では、過度のデータが一度にメモリにロードされるのを防ぎ、プログラムの安定性とパフォーマンスを改善することができます。
array_chunk()を使用する場合、パフォーマンスボトルネックを避けるために、大きな配列の処理に特に注意を払う必要があります。パフォーマンスは次の方法で最適化できます。
array_slice()を使用して、需要のある配列セグメントを処理します。
不必要なメモリオーバーヘッドを避けるために、 Preserve_Keysパラメーターを合理的に設定します。
バッチでデータを処理すると、メモリの使用量が削減され、プログラムの効率が向上します。
これらの最適化方法により、大きな配列をより効率的に処理し、高負荷環境でのパフォーマンスの問題を回避できます。