현재 위치: > 최신 기사 목록> 메모리 효율성을 향상시키기 위해 Array_Diff_ukey ()와 함께 생성기를 사용하십시오.

메모리 효율성을 향상시키기 위해 Array_Diff_ukey ()와 함께 생성기를 사용하십시오.

M66 2025-05-14

매일 PHP 개발에서는 대규모 데이터 컬렉션을 다룰 때 메모리 병목 현상이 종종 발생합니다. PHP의 생성기는 PHP 5.5 이후에 소개되어 데이터 게으른 방법을 제공하는 반면 array_diff_ukey () 함수를 사용하여 키 이름을 기준으로 두 배열의 차이를 사용자 정의하고 비교할 수 있습니다. 이 두 기능을 조합하여 사용하면 특히 데이터 소스가 매우 큰 경우 메모리 효율을 크게 향상시킬 수 있습니다.

이 기사는이 조합의 장점을 소개하고 효율적으로 사용하는 방법을 보여줄 것입니다.

발전기의 장점

기존 배열 트래버스는 전체 배열을 메모리에로드해야하며 발전기는 모든 컨텐츠를 한 번에로드하지 않고 수율 키워드를 통해 필요에 따라 데이터 항목을 생성하므로 큰 데이터 세트를 처리 할 때 특히 효율적입니다.

예제 생성기 함수는 다음과 같습니다.

 function getLargeArrayFromSource() {
    for ($i = 0; $i < 1000000; $i++) {
        yield "key_$i" => "value_$i";
    }
}

이 생성기는 key_0 에서 key_99999 까지 키 값을 가진 큰 배열을 생성하지만 실제로는 한 번에 하나의 키 값 쌍 만 생성합니다.

메모리 최적화를 달성하기 위해 array_diff_ukey ()를 결합합니다

Array_diff_ukey () 함수는 두 번째 배열 키에 포함되지 않은 첫 번째 배열에서 두 배열의 키와 리턴 요소의 키를 비교하는 데 사용됩니다. 일반적 으로이 함수는 두 개의 완전한 배열을 수신하여 슈퍼 큰 배열을 처리 할 때 메모리 오버플로를 유발할 수 있습니다.

그러나 iterator_to_array () 와 결합하여 트래버스 및 비교를 달성하여 메모리 사용을 줄이기 위해 생성기를 통해이 기능에 데이터를 전달할 수 있습니다.

 function getLocalKeys() {
    return [
        "key_1" => "old_value_1",
        "key_2" => "old_value_2",
        "key_999999" => "old_value_final"
    ];
}

function getRemoteKeysGenerator() {
    for ($i = 0; $i < 1000000; $i++) {
        yield "key_$i" => "remote_value_$i";
    }
}

$localKeys = getLocalKeys();
$remoteKeysGenerator = getRemoteKeysGenerator();

// 비교를 위해 생성기를 배열로 변환합니다,그러나 키 이름이 다른 데이터 만 유지됩니다
$diff = array_diff_ukey(
    iterator_to_array($remoteKeysGenerator, false),
    $localKeys,
    function ($a, $b) {
        return strcmp($a, $b);
    }
);

echo "차동 데이터 키 수: " . count($diff) . PHP_EOL;

// 샘플 출력 처리
foreach (array_slice($diff, 0, 5, true) as $key => $value) {
    echo "일치하는 키가 없습니다: $key => $value" . PHP_EOL;
}

개선 기술

  • 비교 데이터가 너무 크면 iterator_to_array ()는 여전히 메모리 압력을 유발할 수 있습니다. 이때, 당신은 차이 비교 로직을 직접 구현하고, 발전기 항목을 하나씩 가로 지르고, 그것이 로컬 키에 존재하는지 판단 할 수 있습니다.

  • 로컬 어레이 키를 해시 컬렉션에 추출하면 비교 효율을 빠르게 검색하고 향상시킬 수 있습니다.

실제 응용 시나리오

제품 SKU를 타사 API와 동기화하는 시스템을 구축하고 특정 수의 SKU와 로컬로, 원격 서버 (예 : https://api.m66.net/products )가 많은 양의 SKU 데이터를 반환한다고 상상해보십시오. 이 게으른 부하+차이 비교 전략은 메모리 제약 서버에서 특히 중요합니다.

요약

생성기를 Array_diff_ukey () 함수와 결합하여 대규모 데이터 처리 중에 PHP 프로그램의 메모리 사용량을 효과적으로 줄일 수 있습니다. 생성기는 실행을 지연시키는 기능을 제공하고 Array_Diff_ukey ()는 키 이름을 비교할 수있는 유연성을 제공하여보다 효율적이고 확장 가능한 데이터 처리 로직을 달성합니다. 이 기사의 예제가 프로젝트에 실질적인 최적화 효과를 가져 오기를 바랍니다.