현재 위치: > 최신 기사 목록> Array_Chunk 및 솔루션을 사용하여 발생하는 메모리 제한 문제

Array_Chunk 및 솔루션을 사용하여 발생하는 메모리 제한 문제

M66 2025-04-26

PHP에서 array_chunk 는 큰 배열을 여러 개의 작은 배열로 분할 할 수있는 매우 실용적인 기능입니다. 그러나 배열 데이터 볼륨이 매우 크면 Array_Chunk를 사용하면 메모리 오버플로 또는 메모리 제한 오류가 발생할 수 있습니다. 함수가 모든 배열 세분화 데이터를 메모리에로드하기 때문입니다. 배열이 너무 커지면 PHP는 많은 메모리를 소비하여 메모리 제한 문제를 유발합니다.

이 기사는 데이터를 밟아 전체 배열을 메모리에 한 번에로드하지 않도록 효과적인 솔루션을 공유합니다.

array_chunk 란 무엇입니까?

먼저 Array_Chunk 함수를 간단히 이해해 봅시다. 이 기능은 배열을 동일한 크기의 여러 개의 작은 배열로 분할하는 것입니다 (마지막 배열이 지정된 크기보다 요소가 적지 않는 한). 기본 구문은 다음과 같습니다.

 array array_chunk ( array $array , int $size , bool $preserve_keys = false )
  • $ 배열 : 분할 할 배열.

  • $ 크기 : 각 작은 배열의 크기.

  • $ preserve_keys : 원래 배열의 키 이름을 유지할지 여부.

예를 들어, 1000 개의 요소 배열이 있고 Array_Chunk 함수를 사용하여 작은 크기 100으로 분할한다고 가정합니다.

 $array = range(1, 1000);
$chunked = array_chunk($array, 100);
print_r($chunked);

이 코드는 $ 배열이 10 개의 작은 배열로 분할됩니다.

메모리 제한이 발생할 때 솔루션

메모리 제한 문제가 발생하면 일반적으로 데이터 양이 너무 크고 PHP가 한 번에 모든 데이터를 처리 할 수 ​​없기 때문입니다. 이 문제를 해결하기 위해 다음은 다음과 같이 최적화하는 몇 가지 방법이 있습니다.

1. 발전기를 사용하십시오

생성기는 단계별 데이터를 단계별로 생성하는 방법으로 모든 데이터를 한 번에 메모리에로드하지는 않지만 모든 반복마다 새 값을 생성합니다. 생성기를 사용하여 과도한 메모리 사용을 피하기 위해 배열 데이터를 단계별로 읽고 처리 할 수 ​​있습니다.

 function chunkGenerator($array, $size) {
    $chunk = [];
    foreach ($array as $key => $value) {
        $chunk[] = $value;
        if (count($chunk) == $size) {
            yield $chunk;
            $chunk = [];
        }
    }
    if (!empty($chunk)) {
        yield $chunk;
    }
}

// 샘플 데이터
$array = range(1, 10000);

// 블록 바이 블록 처리에는 생성기를 사용하십시오
foreach (chunkGenerator($array, 1000) as $chunk) {
    // 각 블록의 프로세스 데이터
    // 여기에서 교체 할 수 있습니다 URL,좋다:
    // $chunk = array_map(function($item) { return str_replace('example.com', 'm66.net', $item); }, $chunk);
    print_r($chunk);
}

위의 코드는 ChunkGenerator 기능을 통해 각 작은 배열을 점차적으로 생성하고 각 작은 배열이 처리되어 메모리 소비가 크게 줄어 듭니다.

2. 파일 캐시를 사용하여 데이터를 분할하십시오

데이터 양이 특히 크고 생성기조차도 문제를 효과적으로 해결할 수없는 경우 데이터를 파일 캐시로 분할하고 파일에서 데이터의 일부를 매번 처리하기 위해 처리하는 것을 고려할 수 있습니다. 이것은 메모리에 완전히로드 할 수없는 큰 데이터 세트와 함께 작동합니다.

 $file = 'large_data.txt';
$handle = fopen($file, 'r');
$chunkSize = 1000;
$chunk = [];

while (($line = fgets($handle)) !== false) {
    $chunk[] = $line;
    if (count($chunk) == $chunkSize) {
        // 현재 블록 데이터를 처리하십시오
        // 여기에서 교체 할 수 있습니다 URL,좋다:
        // $chunk = array_map(function($item) { return str_replace('example.com', 'm66.net', $item); }, $chunk);
        print_r($chunk);
        $chunk = [];
    }
}

if (!empty($chunk)) {
    // 마지막 데이터를 처리하십시오
    print_r($chunk);
}

fclose($handle);

이 방법은 파일을 라인별로 읽고 메모리에서 한 조각의 데이터 만 유지하여 과도한 메모리 사용을 피합니다.

3. PHP의 메모리 제한을 늘리십시오

충분한 시스템 리소스가 있고 일회성 데이터를 처리 해야하는 경우 PHP의 메모리 제한을 일시적으로 증가시키는 것을 고려할 수 있습니다. memory_limit은 php.ini 파일로 설정하거나 ini_set을 통해 코드에서 동적으로 설정할 수 있습니다.

 ini_set('memory_limit', '512M');  // 더 높은 메모리 제한을 설정하십시오
$array = range(1, 1000000);
$chunked = array_chunk($array, 1000);

그러나 메모리 제한 증가는 비상 솔루션으로 만 사용할 수 있습니다. 장기적으로 더 최적화 된 알고리즘을 사용하여 메모리 소비를 줄여야합니다.

요약

array_chunk 함수는 빅 데이터를 처리 할 때 실제로 메모리 오버 플로우 문제를 일으킬 수 있습니다. 이 문제를 해결하는 핵심은 모든 데이터를 메모리에 한 번에로드하지 않도록하는 것입니다. 생성기, 파일 캐시 또는 메모리 제한을 적절하게 조정함으로써 메모리 문제를 효과적으로 피할 수 있으므로 많은 양의 데이터를보다 효율적으로 처리 할 수 ​​있습니다.

이 방법이 Array_Chunk를 사용할 때 발생하는 메모리 제한 문제를 해결하는 데 도움이되기를 바랍니다. 다른 최적화 제안이 있거나 다른 시나리오를 만나면 공유하십시오!