현재 위치: > 최신 기사 목록> 큰 배열을 처리 할 때 Array_Count_Values ​​()를 직접 사용하여 발생하는 성능 문제를 피하는 방법은 무엇입니까?

큰 배열을 처리 할 때 Array_Count_Values ​​()를 직접 사용하여 발생하는 성능 문제를 피하는 방법은 무엇입니까?

M66 2025-06-26

php에서 array_count_values ​​()는 배열에서 모든 요소의 발생 수를 계산하는 매우 일반적인 기능입니다. 이 기능은 많은 시나리오에서 매우 편리하지만 배열 데이터가 매우 클 때 성능 문제를 일으킬 수 있습니다. array_count_values ​​()가 전체 배열을 반복하고 각 요소의 수를 저장하는 새 배열을 만들고 큰 배열을 처리 할 때 많은 메모리와 CPU 시간을 소비하기 때문입니다.

Array_Count_Values ​​()가 성능에 영향을 미치는 이유는 무엇입니까?

Array_Count_Values ​​()를 호출하면 PHP가 배열을 두 번 횡단합니다. 먼저 배열을 반복하고 각 값에 카운트를 할당하십시오. 그런 다음 PHP는 각 요소와 그 카운트를 저장하여 메모리 사용량과 가능한 성능 병목 현상으로 이어집니다. 큰 배열, 특히 작은 메모리가있는 환경에서 성능 병목 현상이 더 분명합니다.

배열이 수백만 개의 요소를 포함하는 것과 같이 매우 큰 경우 array_count_values ​​() 의 메모리 소비로 인해 PHP 스크립트가 시간이 초과되고 서버 충돌도 발생할 수 있습니다. 따라서이 기능을 직접 사용하지 않으려면 일부 최적화 방법을 채택해야합니다.

큰 배열을 처리 할 때 성능을 최적화하는 방법은 무엇입니까?

  1. 수동 계산 :

    배열을 직접 반복하고 array_count_values ​​() 에 의존하는 대신 사용자 정의 계산 방법을 사용하십시오. 이러한 방식으로, 메모리 소비가 줄어들고 더 미세한 제어가 허용 될 수있다.

    예를 들어, 수동 계산 코드는 다음과 같습니다.

     $array = [1, 2, 3, 2, 1, 2, 3, 3, 3, 4];
    $counts = [];
    
    foreach ($array as $value) {
        if (isset($counts[$value])) {
            $counts[$value]++;
        } else {
            $counts[$value] = 1;
        }
    }
    
    print_r($counts);
    

    이 메소드는 Array_Count_Values ​​() 의 메모리 오버 헤드를 피하고 원래 배열에 직접 계산하여 성능을 크게 향상시킵니다.

  2. 배치 처리 :

    배열이 매우 크면 배열을 배치 할 수 있습니다. 배열을 작은 청크로 분할하여 각 청크를 블록으로 계산 한 다음 결과를 병합하십시오. 이것은 메모리 사용량을 효과적으로 줄이고 각 계산을 더 작은 메모리 범위 내에서 수행 할 수 있도록합니다.

    예를 들어, array_chunk () 함수를 사용하여 배열을 작은 청크로 분할 할 수 있습니다.

     $array = range(1, 1000000);  // 매우 큰 배열
    $chunkedArrays = array_chunk($array, 10000);  // 배열을 작은 조각으로 나눕니다,각 블록에는 포함됩니다10000강요
    
    $counts = [];
    foreach ($chunkedArrays as $chunk) {
        foreach ($chunk as $value) {
            if (isset($counts[$value])) {
                $counts[$value]++;
            } else {
                $counts[$value] = 1;
            }
        }
    }
    
    print_r($counts);
    

    이 방법은 메모리 압력을 효과적으로 줄이고 매우 큰 데이터를 처리 할 때 메모리 오버플로로 인해 PHP 스크립트가 충돌하지 않도록 할 수 있습니다.

  3. 데이터베이스 또는 캐시 사용 :

    매우 큰 데이터 세트의 경우 데이터 소스가 데이터베이스 또는 외부 서비스에서 나오는 경우 데이터베이스에 데이터를 저장하고 모든 데이터를 메모리에로드하지 않도록 COUNT () 와 같은 SQL 집계 기능을 사용하여 계산하는 것을 고려하십시오.

    데이터가 자주 업데이트되면 캐싱 기술 (예 : Redis 또는 Memcached)을 사용하여 계산 결과를 캐시하여 중복 계산 오버 헤드를 줄일 수 있습니다.

    예를 들어 다음 SQL 쿼리를 사용하여 메모리 부담을 피할 수 있습니다.

     SELECT value, COUNT(*) as count
    FROM your_table
    GROUP BY value;
    
  4. 처리 된 데이터 양을 제한합니다.

    경우에 따라 전체 배열이 필요하지 않을 수 있습니다. 처리 된 데이터의 양을 제한함으로써 불필요한 성능 오버 헤드를 피할 수 있습니다. 배열 또는 특정 범위의 부분 요소에만 관심이있는 경우 배열을 필터링하여 데이터 양을 줄일 수 있습니다.

    예를 들어:

     $array = range(1, 1000000);
    $filteredArray = array_filter($array, function($value) {
        return $value > 500000;  // 보다 크게 처리합니다500000강요
    });
    
    // 그런 다음 수동 계산을 계속하십시오
    $counts = [];
    foreach ($filteredArray as $value) {
        if (isset($counts[$value])) {
            $counts[$value]++;
        } else {
            $counts[$value] = 1;
        }
    }
    
    print_r($counts);
    

요약

Array_Count_Values ​​() 는 편리한 기능이지만 큰 배열을 처리 할 때 성능 병목 현상을 유발할 수 있습니다. 수동 계산, 배치 처리, 데이터베이스 집계 또는 캐싱 기술을 통해 성능 문제를 효과적으로 피할 수 있습니다. 특정 요구에 따라 PHP 프로그램이 효율적으로 실행되도록 성능을 최적화하는 올바른 방법을 선택하십시오.