현재 위치: > 최신 기사 목록> Array_Slice가 큰 배열을 처리하면 많은 메모리가 필요합니까?

Array_Slice가 큰 배열을 처리하면 많은 메모리가 필요합니까?

gitbox 2025-05-29

PHP 개발에서 Array_Slice는 배열에서 지정된 길이의 조각을 가로 채기 위해 사용되는 매우 일반적인 배열 작동 함수입니다. 기본 사용량은 간단하고 명확하지만, 대형 배열에 직면하면 개발자는 종종 메모리 사용에 관심을 갖습니다. 특히 메모리 사용이 급격히 증가하여 프로그램 성능과 안정성에 영향을 줄 수 있습니다.

이 기사는 Array_Slice 함수의 메모리 사용 메커니즘을 깊이 분석하고 코드 예제와 결합하여 모든 사람이 큰 배열을 처리 할 때 기능의 성능을 이해하고 최적화 제안을 제공 할 수 있도록 도와줍니다.

Array_Slice의 기본 원리

Array_Slice (array $ array, int $ offset,? int $ longth = null, bool $ preserve_keys = false) : 배열

  • $ 배열 : 배열을 입력하십시오

  • $ 오프셋 : 시작 위치

  • $ 길이 : 길이를 가로 채기 (선택 사항)

  • $ preserve_keys : 원래 배열 키 이름을 유지할지 여부는 기본적으로 보존되지 않습니다 (키 이름은 다시 표시됩니다)

Array_Slice는 입력 배열의 조각을 반환하고 함수 자체는 데이터 의이 부분을 새로운 배열로 복사 할 수 있습니다.

메모리 사용 분석

배열 크기가 작 으면 Array_Slice 의 메모리 풋 프린트는 일반적으로 주목을받지 않습니다. 그러나 수백만 또는 수천만의 요소에 대면 할 때 Array_Slice 의 메모리 오버 헤드는 경계 할 가치가 있습니다.

복제 메커니즘은 메모리가 증가합니다

Array_Slice는 원래 배열을 제자리에 참조하거나 차단하지 않지만 해당 배열 부품을 복사하여 새로운 배열을 생성합니다. 이것은 다음을 의미합니다.

  • 원래 배열이 메모리를 x로 사용하는 경우

  • 길이 y의 스 니펫,

  • 반환 된 새 배열은 또한 y 크기와 거의 동일한 메모리를 소비합니다.

따라서 가로 채기 된 조각이 크면 메모리 사용이 두 배 또는 더 많은 것입니다 (원래 배열과 함께).

샘플 코드

 <?php
// 슈퍼 큰 배열을 시뮬레이션합니다
$largeArray = range(1, 10_000_000);

// 배열 중간에 백만 개의 데이터를 꺼냅니다.
$startTime = microtime(true);
$slice = array_slice($largeArray, 4_000_000, 1_000_000);
$endTime = microtime(true);

echo "시간이 많이 걸리는 차단:" . ($endTime - $startTime) . "두번째\n";
echo "원래 배열 메모리:" . (memory_get_usage() / 1024 / 1024) . " MB\n";

// 부분 절편 결과에 액세스하십시오
echo "첫 번째 요소를 자릅니다:" . $slice[0] . "\n";
?>

이 코드를 실행하면 다음을 볼 수 있습니다.

  • 스크립트가 차지하는 메모리가 크게 증가합니다 (원래 배열 + 슬라이스 어레이)

  • 프로그램의 실행 시간은 일반 소규모 배열 작업에 비해 크게 증가했습니다.

결론적으로

Array_Slice는 해당 배열 데이터를 복사하기 때문에 슈퍼 큰 배열을 처리 할 때 메모리 사용량이 크게 증가합니다.

최적화 제안

1. 한 번에 슈퍼 큰 배열로드를 피하십시오.

배열 데이터가 파일 또는 데이터베이스에서 나온 경우 단계별로 읽거나 생성기를 사용하여 모든 데이터를 한 번에로드하지 않기 위해 필요에 따라 데이터를 처리하는 것이 좋습니다.

2. 필요한 부품 만 차단하십시오

데이터의 작은 부분 만 필요하면 array_slice 에 의해 가로 채는 작은 조각은 메모리를 줄이고 영향이 제한됩니다.

3. 반복자를 사용하여 배열을 교체하십시오

PHP의 반복자 인터페이스 (예 : Limititerator )는 배열을 복사하지 않고도 유사한 인터셉트와 같은 효과를 얻을 수 있습니다.

예:

 <?php
$array = new ArrayIterator(range(1, 10_000_000));
$iterator = new LimitIterator($array, 4_000_000, 1_000_000);

foreach ($iterator as $value) {
    // 거래하십시오$value
}
?>

이렇게하면 배열 복사를 피하고 메모리를 저장합니다.

4. PHP 메모리 제한을 조정하십시오

큰 배열을 처리하기 위해 Array_Slice를 사용해야하는 경우, PHP의 메모리 제한 의 Memory_Limit이 프로그램의 비정상적인 종료를 피할 수있을 정도로 충분히 커지는지 확인하십시오.

결론

Array_Slice 기능은 슈퍼 큰 배열을 처리 할 때 배열 조각을 복사하므로 메모리 사용이 크게 증가합니다. 수천만 배의 배열에 직면하는 경우 메모리 병목 현상을 피하고 프로그램 성능 및 안정성을 향상시키기 위해 반복자 또는 청크 독서 사용을 고려하는 것이 좋습니다.

더 많은 PHP 기술을 보려면 최신 자습서 및 실제 경험을 보려면 https://gitbox.net/php-tips를 방문하십시오.