PHP開発では、 Array_sliceは、指定された長さの断片を配列から傍受するために使用される非常に一般的な配列動作機能です。その基本的な使用法はシンプルで明確ですが、超大型アレイに直面している場合、開発者はメモリの使用量、特にメモリ使用量の急激な増加を引き起こすかどうかを気にします。
この記事では、 Array_Slice関数のメモリ使用メカニズムを詳細に分析し、コード例と組み合わせて、スーパーラージアレイを処理するときに全員が関数のパフォーマンスを理解し、最適化の提案を提供します。
array_slice(array $ array、int $ offset、?int $ length = null、bool $ preserve_keys = false):array
$配列:配列を入力します
$ offset :開始位置
$ length :長さをインターセプトする(オプション)
$ preserve_keys :元の配列キー名を保持するかどうか、デフォルトでは保持されません(キー名は再インド化されます)
array_sliceは入力配列のフラグメントを返し、関数自体がデータのこの部分を新しい配列にコピーして返すようにします。
配列のサイズが小さい場合、 array_sliceのメモリフットプリントは通常、注意を引き付けません。ただし、数百万または数千万の要素の大量に直面している場合、 array_sliceのメモリオーバーヘッドは警戒に値します。
Array_sliceは、元の配列を所定の位置に参照または傍受することはありませんが、対応する配列パーツをコピーして新しい配列を生成します。これはつまり:
元の配列がxとしてメモリを占める場合、
yのスニペット、
返された新しい配列は、Yサイズとほぼ同じメモリも消費します。
したがって、インターセプトされたフラグメントが大きい場合、メモリの使用量は2倍またはそれ以上になります(および元の配列)。
<?php
// 超大型アレイをシミュレートします
$largeArray = range(1, 10_000_000);
// 配列の中央に100万個のデータを取り出します
$startTime = microtime(true);
$slice = array_slice($largeArray, 4_000_000, 1_000_000);
$endTime = microtime(true);
echo "時間のかかる傍受:" . ($endTime - $startTime) . "2番\n";
echo "元の配列メモリ:" . (memory_get_usage() / 1024 / 1024) . " MB\n";
// 部分インターセプトの結果にアクセスします
echo "最初の要素をスライスします:" . $slice[0] . "\n";
?>
このコードを実行すると、次のように表示されます。
スクリプトが占めるメモリは大幅に増加します(元の配列 +スライス配列)
プログラムの実行時間は、通常の小アレイ操作と比較して大幅に増加しています。
Array_sliceは、対応する配列データをコピーするため、超大型アレイを扱うときにメモリ使用量が大幅に増加します。
配列データがファイルまたはデータベースから来ている場合は、すべてのデータを一度にロードしないように、必要に応じてデータを処理するためにジェネレーターを使用して使用することを検討してください。
データのごく一部のみが必要な場合、 Array_sliceによって傍受される小さなフラグメントは、メモリを減らし、影響が限られています。
PHPのイテレーターインターフェイス( Limititeratorなど)は、配列をコピーせずに同様のインターセプトのような効果を達成できます。
例:
<?php
$array = new ArrayIterator(range(1, 10_000_000));
$iterator = new LimitIterator($array, 4_000_000, 1_000_000);
foreach ($iterator as $value) {
// 対処する$value
}
?>
これにより、アレイのコピーが回避され、メモリが保存されます。
Array_Sliceを使用して大きな配列を処理する必要がある場合は、PHPのメモリ制限のMemory_limitがプログラムの異常な終了を避けるのに十分な大きさであることを確認してください。
Array_slice関数は、超大型アレイを処理するときにArrayフラグメントをコピーします。これにより、メモリ使用量が大幅に増加します。数千万人の配列に直面している場合は、メモリボトルネックを避け、プログラムのパフォーマンスと安定性を改善するために、反復剤または塊の読み取りを使用することを検討することをお勧めします。
PHPのスキルについては、最新のチュートリアルと実際の経験については、 https://gitbox.net/php-tipsにアクセスしてください。