PHP에서 array_chunk 는 큰 배열을 여러 개의 작은 배열로 분할 할 수있는 매우 실용적인 기능입니다. 그러나 배열 데이터 볼륨이 매우 크면 Array_Chunk를 사용하면 메모리 오버플로 또는 메모리 제한 오류가 발생할 수 있습니다. 함수가 모든 배열 세분화 데이터를 메모리에로드하기 때문입니다. 배열이 너무 커지면 PHP는 많은 메모리를 소비하여 메모리 제한 문제를 유발합니다.
이 기사는 데이터를 밟아 전체 배열을 메모리에 한 번에로드하지 않도록 효과적인 솔루션을 공유합니다.
먼저 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가 한 번에 모든 데이터를 처리 할 수 없기 때문입니다. 이 문제를 해결하기 위해 다음은 다음과 같이 최적화하는 몇 가지 방법이 있습니다.
생성기는 단계별 데이터를 단계별로 생성하는 방법으로 모든 데이터를 한 번에 메모리에로드하지는 않지만 모든 반복마다 새 값을 생성합니다. 생성기를 사용하여 과도한 메모리 사용을 피하기 위해 배열 데이터를 단계별로 읽고 처리 할 수 있습니다.
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 기능을 통해 각 작은 배열을 점차적으로 생성하고 각 작은 배열이 처리되어 메모리 소비가 크게 줄어 듭니다.
데이터 양이 특히 크고 생성기조차도 문제를 효과적으로 해결할 수없는 경우 데이터를 파일 캐시로 분할하고 파일에서 데이터의 일부를 매번 처리하기 위해 처리하는 것을 고려할 수 있습니다. 이것은 메모리에 완전히로드 할 수없는 큰 데이터 세트와 함께 작동합니다.
$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);
이 방법은 파일을 라인별로 읽고 메모리에서 한 조각의 데이터 만 유지하여 과도한 메모리 사용을 피합니다.
충분한 시스템 리소스가 있고 일회성 데이터를 처리 해야하는 경우 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를 사용할 때 발생하는 메모리 제한 문제를 해결하는 데 도움이되기를 바랍니다. 다른 최적화 제안이 있거나 다른 시나리오를 만나면 공유하십시오!