PHP에서 array_chunk 함수는 큰 배열을 작은 청크로 분할하기위한 매우 실용적인 도구입니다. 편리한 기능을 제공하지만 특히 배열이 매우 크거나 너무 많은 분할 블록 일 때 매우 큰 배열을 처리 할 때 메모리 오버 플로우 문제를 일으킬 수 있습니다.
Array_Chunk 함수의 기본 구문은 다음과 같습니다.
array_chunk(array $array, int $length, bool $preserve_keys = false): array
$ 배열 : 입력 배열.
$ 길이 : 각 서브 어레이의 요소 수.
$ preserve_keys : 원래 배열의 키 값을 유지할지 여부를 결정하는 부울 값.
$array = [1, 2, 3, 4, 5, 6, 7, 8, 9];
$chunks = array_chunk($array, 3);
print_r($chunks);
산출:
Array
(
[0] => Array ( [0] => 1 [1] => 2 [2] => 3 )
[1] => Array ( [0] => 4 [1] => 5 [2] => 6 )
[2] => Array ( [0] => 7 [1] => 8 [2] => 9 )
)
이 코드는 배열 $ 배열을 3 개의 블록으로 나눕니다. 각 블록에는 3 개의 요소가 포함됩니다.
매우 큰 배열을 분할하면 array_chunk는 각 서브 어레이에 원래 배열의 데이터의 일부가 포함 된 새로운 2 차원 배열을 반환합니다. 원래 배열이 매우 크고 블록 수가 매우 크면, PHP가 메모리에 많은 수의 서브 배열을 생성하여 메모리 오버 플로우 문제가 발생할 수 있습니다.
수백만의 요소를 포함하는 매우 큰 배열이 있다고 가정하십시오. Array_Chunk를 사용하여 1000 청크로 분할되면 많은 수의 서브 어레이가 생성 될 수 있으며, 각각은 메모리를 가져 가야하므로 메모리 사용이 급격히 증가하여 메모리 오버플로를 유발합니다.
Array_Chunk를 사용할 때 메모리 오버 플로우를 피하려면 다음 전략을 채택 할 수 있습니다.
생성기는 PHP가 제공하는 메모리 효율적인 방법으로, 모든 데이터를 메모리에 한 번에로드하는 대신 요구에 따라 데이터를 생성 할 수 있습니다. 발전기를 사용하여 블록별로 데이터를 처리하므로 전체 배열을 메모리에 한 번에로드하는 것을 피할 수 있습니다.
function chunkGenerator(array $array, $chunkSize) {
$chunk = [];
foreach ($array as $key => $value) {
$chunk[] = $value;
if (count($chunk) >= $chunkSize) {
yield $chunk;
$chunk = [];
}
}
if (count($chunk) > 0) {
yield $chunk;
}
}
$array = range(1, 10000000);
foreach (chunkGenerator($array, 1000) as $chunk) {
// 각각 처리 $chunk
}
이 예에서는 수율 키워드를 사용하여 발전기를 만들었습니다. 블록이 생성 될 때마다 모든 블록을 한 번에 메모리에로드하는 대신 일시적으로 블록을 반환합니다. 이것은 메모리 사용량을 크게 줄일 수 있습니다.
생성기를 사용할 수없는 경우 배치를로드하거나 데이터를 단계별로 처리하여 메모리 오버플로를 피하는 것을 고려할 수 있습니다. 예를 들어, 데이터가 데이터베이스 또는 외부 API에서 나온 경우 전체 대형 배열을 한 번에로드하는 대신 데이터를 배치로로드 할 수 있습니다.
데이터가 URL에서 가져 왔다고 가정하면 모든 것을 한 번에로드하는 대신 URL의 데이터를 단계별로로드 할 수 있습니다.
function fetchDataInChunks($url, $chunkSize) {
$handle = fopen($url, 'r');
$chunk = [];
while (($line = fgets($handle)) !== false) {
$chunk[] = $line;
if (count($chunk) >= $chunkSize) {
yield $chunk;
$chunk = [];
}
}
fclose($handle);
if (count($chunk) > 0) {
yield $chunk;
}
}
$url = 'https://m66.net/data.csv';
foreach (fetchDataInChunks($url, 1000) as $chunk) {
// 각각 처리 $chunk
}
배열 데이터가 매우 크지 만 생성기를 사용하지 않으려면 각 블록의 크기를 조정하여 한 번에 생성 된 블록 수를 줄일 수 있습니다. 예를 들어, 블록 크기를 조금 더 크게 설정하고 많은 작은 블록으로 분할하는 대신 매번 더 큰 블록의 데이터를 처리하십시오.
Array_Chunk 로 큰 배열을 분할하면 특히 배열이 특히 크거나 블록 수가 너무 큰 경우 메모리 오버 플로우 문제가 발생할 수 있습니다. 이 문제를 해결하기 위해 다음 방법을 사용할 수 있습니다.
생성기 사용 : 주문형 데이터를 생성하여 메모리 풋 프린트를 줄입니다.
단계별 : 데이터가 외부 소스에서 나오면 데이터를 배치로로드 할 수 있습니다.
블록 크기 : 블록 수를 줄이고 각 블록의 크기를 늘려 메모리 사용량을 줄입니다.
이러한 방법을 사용하면 데이터 볼륨이 큰 경우 메모리 문제를 효과적으로 처리하여 프로그램을보다 효율적으로 실행할 수 있습니다.