>백엔드 개발 >PHP 튜토리얼 >메모리 부족 없이 Laravel에서 대규모 데이터 세트를 처리하는 방법

메모리 부족 없이 Laravel에서 대규모 데이터 세트를 처리하는 방법

Patricia Arquette
Patricia Arquette원래의
2024-11-25 20:41:15908검색

How to Handle Large Datasets in Laravel Without Running Out of Memory

메모리 부족 없이 Laravel에서 대규모 데이터 세트를 처리하는 방법

Laravel에서 대량의 데이터로 작업할 때 애플리케이션의 메모리 부족과 같은 문제가 발생하는 것이 일반적입니다. 이는 수천(또는 수백만) 개의 레코드를 메모리에 동시에 로드하려고 할 때 발생할 수 있습니다. 하지만 라라벨은 데이터를 작은 덩어리로 처리하는 데 도움이 되는 몇 가지 유용한 방법을 제공하므로 메모리를 절약하고 애플리케이션을 더 빠르게 실행할 수 있습니다. 이번 포스팅에서는 chunk(), chunkById(), Lazy Collections를 사용하여 Laravel에서 대규모 데이터세트를 효율적으로 처리하는 방법을 살펴보겠습니다.

Chunk() 메소드란 무엇입니까?

Laravel의 Chunk() 메소드를 사용하면 모든 것을 한 번에 로드하는 대신 레코드의 작은 하위 집합을 한 번에 검색할 수 있습니다. 이 방법은 많은 수의 레코드를 처리해야 하지만 너무 많은 메모리를 사용하지 않으려는 경우에 유용합니다.

예: Chunk()를 사용하여 데이터 일괄 처리

주문 테이블이 있고 각 주문의 상태를 "처리됨"으로 업데이트한다고 가정해 보겠습니다. 모든 주문을 한 번에 메모리에 로드하는 대신, Chunk()를 사용하여 한 번에 100개의 주문을 로드하고 더 작은 배치로 처리할 수 있습니다.

use App\Models\Order;

Order::chunk(100, function ($orders) {
    foreach ($orders as $order) {
        // Process each order
        $order->update(['status' => 'processed']);
    }
});
  • 100은 한 번에 처리하려는 레코드 수입니다.
  • 콜백 함수는 100개 레코드의 각 "청크"에 대해 호출됩니다.
  • 처음 100개를 처리한 후 다음 배치로 넘어가는 식으로 진행됩니다.

왜 청크()를 사용하나요?

  • 메모리 절약: 모든 레코드를 한 번에 로드하는 대신 Laravel은 작은 세트(이 예에서는 100)만 로드하여 메모리 사용량을 낮게 유지합니다.
  • 효율적인 처리: 이를 통해 앱 충돌이나 속도 저하 없이 대규모 데이터 세트 작업을 더 쉽게 할 수 있습니다.

ChunkById() 메서드란 무엇입니까?

chunkById() 메서드는 Chunk()와 유사하지만 레코드를 처리하는 동안 업데이트할 때 더 좋습니다. 이 방법을 사용하면 레코드가 ID 열을 기준으로 항상 일관된 순서로 검색되므로 레코드 누락 없이 데이터를 더욱 안전하게 업데이트할 수 있습니다.

예: 일관된 업데이트를 위해 ChunkById() 사용

주문 상태를 업데이트하고 싶지만 주문 ID가 순서대로 처리되는지 확인해야 한다고 가정해 보세요. ChunkById()를 사용하면 주문을 업데이트하는 경우에도 주문을 건너뛰거나 두 번 처리하는 일이 없습니다.

use App\Models\Order;

Order::chunk(100, function ($orders) {
    foreach ($orders as $order) {
        // Process each order
        $order->update(['status' => 'processed']);
    }
});
  • chunkById(100) 메소드를 사용하면 레코드가 100개 일괄 검색되지만 ID가 마지막 일괄보다 큰 주문만 가져옵니다. 이를 통해 기록 누락을 방지할 수 있습니다.
  • 'id'는 레코드가 처리되는 순서를 결정하는 컬럼입니다.

왜 ChunkById()를 사용하나요?

  • 일관성: 레코드를 처리하는 동안 업데이트할 때 ChunkById()는 레코드를 건너뛰거나 두 번 처리하는 것을 방지하여 데이터 일관성을 유지하는 데 도움이 됩니다.
  • 대규모 데이터 업데이트에 안전: 이는 상태 업데이트와 같이 프로세스 중에 레코드를 수정할 때 이상적입니다.

하나씩 처리하기 위해 게으른 컬렉션 사용하기

chunk() 및 ChunkById()는 레코드를 일괄 처리하는 반면, Lazy Collections를 사용하면 레코드를 하나씩 처리할 수 있습니다. 이는 많은 메모리를 사용하지 않고 검색된 각 레코드를 처리하려는 경우 특히 유용합니다.

예: 지연 컬렉션 사용

한 번에 하나의 레코드만 처리해야 한다면 Lazy Collections가 훌륭한 옵션이 될 수 있습니다. 다음은 각 주문 기록을 개별적으로 처리하는 예입니다.

use App\Models\Order;

Order::chunkById(100, function ($orders) {
    foreach ($orders as $order) {
        // Update each order's status
        $order->update(['status' => 'processed']);
    }
}, 'id');
  • lazy()를 사용하면 전체 데이터 세트를 메모리에 로드하지 않고 각 주문이 한 번에 하나씩 처리됩니다.
  • 이 기능은 모든 레코드를 한 번에 메모리에 보관하지 않으므로 매우 큰 데이터세트를 처리할 때 유용합니다.

게으른 컬렉션을 사용하는 이유는 무엇입니까?

  • 매우 낮은 메모리 사용량: 각 레코드는 검색되는 대로 처리되므로 메모리 사용량이 최소화됩니다.
  • 대규모 데이터 세트에 적합: 엄청난 수의 레코드를 처리해야 하고 높은 메모리 사용량을 피하고 싶다면 Lazy Collections가 가장 좋은 친구입니다.

언제 어떤 방법을 사용해야 하는가

  • Chunk()를 사용하면 100 또는 200과 같이 설정된 크기의 일괄 처리로 레코드를 처리하고 싶지만 레코드 순서에 대해 걱정할 필요가 없습니다.
  • chunkById() 레코드를 일괄 처리해야 하지만 업데이트 시 일관성도 보장해야 하는 경우 사용하세요. 이 방법을 사용하면 레코드를 두 번 건너뛰거나 처리하는 일이 발생하지 않습니다.
  • 지연 컬렉션 한 번에 하나씩 레코드를 처리해야 하고 메모리 사용량을 최소화하려는 경우

결론: Laravel의 효율적인 데이터 처리

Laravel은 메모리 문제 없이 대규모 데이터 세트를 작업할 수 있는 매우 강력한 도구를 제공합니다. 다음은 우리가 배운 내용을 간단히 요약한 것입니다.

  • chunk(): 레코드를 작은 배치로 처리하여 메모리를 절약합니다.
  • chunkById(): 일관성을 보장하면서 레코드를 일괄 처리합니다(업데이트에 적합).
  • 지연 컬렉션: 레코드를 한 번에 하나씩 처리하므로 메모리 사용량을 최소화하면서 대규모 데이터세트에 적합합니다.

이러한 방법을 사용하면 Laravel 애플리케이션이 수백만 개의 레코드를 처리하는 경우에도 대규모 데이터 세트를 효율적으로 처리할 수 있습니다. 이러한 기술은 처리해야 하는 데이터의 양에 관계없이 제대로 작동하는 확장 가능한 애플리케이션을 구축하는 데 필수적입니다.

위 내용은 메모리 부족 없이 Laravel에서 대규모 데이터 세트를 처리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.