현재 위치: > 최신 기사 목록> Array_Chunk를 사용할 때 메모리 오버플로를 피하는 방법

Array_Chunk를 사용할 때 메모리 오버플로를 피하는 방법

M66 2025-04-28

PHP에서 array_chunk 함수는 큰 배열을 작은 청크로 분할하기위한 매우 실용적인 도구입니다. 편리한 기능을 제공하지만 특히 배열이 매우 크거나 너무 많은 분할 블록 일 때 매우 큰 배열을 처리 할 때 메모리 오버 플로우 문제를 일으킬 수 있습니다.

1. 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 개의 요소가 포함됩니다.

2. array_chunk가 메모리 오버플로를 유발하는 이유는 무엇입니까?

매우 큰 배열을 분할하면 array_chunk는 각 서브 어레이에 원래 배열의 데이터의 일부가 포함 된 새로운 2 차원 배열을 반환합니다. 원래 배열이 매우 크고 블록 수가 매우 크면, PHP가 메모리에 많은 수의 서브 배열을 생성하여 메모리 오버 플로우 문제가 발생할 수 있습니다.

예를 들어:

수백만의 요소를 포함하는 매우 큰 배열이 있다고 가정하십시오. Array_Chunk를 사용하여 1000 청크로 분할되면 많은 수의 서브 어레이가 생성 될 수 있으며, 각각은 메모리를 가져 가야하므로 메모리 사용이 급격히 증가하여 메모리 오버플로를 유발합니다.

3. 메모리 오버플로를 피하는 방법은 무엇입니까?

Array_Chunk를 사용할 때 메모리 오버 플로우를 피하려면 다음 전략을 채택 할 수 있습니다.

3.1 발전기 사용

생성기는 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
}

이 예에서는 수율 키워드를 사용하여 발전기를 만들었습니다. 블록이 생성 될 때마다 모든 블록을 한 번에 메모리에로드하는 대신 일시적으로 블록을 반환합니다. 이것은 메모리 사용량을 크게 줄일 수 있습니다.

3.2 단계별 처리 대형 어레이

생성기를 사용할 수없는 경우 배치를로드하거나 데이터를 단계별로 처리하여 메모리 오버플로를 피하는 것을 고려할 수 있습니다. 예를 들어, 데이터가 데이터베이스 또는 외부 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
}

3.3 한 번에 과도한 블록 생성을 줄입니다

배열 데이터가 매우 크지 만 생성기를 사용하지 않으려면 각 블록의 크기를 조정하여 한 번에 생성 된 블록 수를 줄일 수 있습니다. 예를 들어, 블록 크기를 조금 더 크게 설정하고 많은 작은 블록으로 분할하는 대신 매번 더 큰 블록의 데이터를 처리하십시오.

4. 요약

Array_Chunk 로 큰 배열을 분할하면 특히 배열이 특히 크거나 블록 수가 너무 큰 경우 메모리 오버 플로우 문제가 발생할 수 있습니다. 이 문제를 해결하기 위해 다음 방법을 사용할 수 있습니다.

  1. 생성기 사용 : 주문형 데이터를 생성하여 메모리 풋 프린트를 줄입니다.

  2. 단계별 : 데이터가 외부 소스에서 나오면 데이터를 배치로로드 할 수 있습니다.

  3. 블록 크기 : 블록 수를 줄이고 각 블록의 크기를 늘려 메모리 사용량을 줄입니다.

이러한 방법을 사용하면 데이터 볼륨이 큰 경우 메모리 문제를 효과적으로 처리하여 프로그램을보다 효율적으로 실행할 수 있습니다.

참조