ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • query builder big data set 작업시 지연 로드 lazy 와 lazyById 메서드
    백엔드/laravel 2024. 1. 14. 19:49

    lazy 메서드와 lazyById 메서드는 Laravel의 쿼리 빌더에서 대량의 데이터를 처리할 때 메모리 부족 문제를 방지하기 위한 방법으로 사용됩니다.

     

    lazy 메서드:

    • lazy 메서드는 대량의 레코드를 메모리에 한꺼번에 로드하지 않고 필요한 시점에 청크 단위로 데이터를 검색하는 데 사용됩니다.
    • lazy 메서드는 LazyCollection 인스턴스를 반환하며, 반복되는 동안 작은 청크 단위로 결과를 가져옵니다.
    • 기본적으로 청크 크기는 1000입니다.
    • each 메서드를 사용하여 데이터를 처리할 때 메모리 부족 문제를 방지할 수 있습니다.

        $posts = DB::table('posts')->orderBy('id')->lazy();

        $posts->each(function ($post) {
            echo $post->title;
        });

     

    lazyById 메서드:

    • lazyById 메서드는 특정 ID에 해당하는 레코드를 메모리에 한꺼번에 로드하지 않고 필요한 시점에 청크 단위로 데이터를 검색하는 데 사용됩니다.
    • 일반적으로는 특정 ID에 해당하는 레코드를 로드하고자 할 때 사용됩니다.
    • first 메서드를 사용하여 첫 번째 레코드를 가져올 수 있습니다.

        $post = DB::table('posts')->where('id', 1000)->lazyById()->first();

     

    이러한 방법을 사용하면 대량의 데이터를 처리할 때 발생할 수 있는 메모리 소모 문제를 방지하면서 데이터를 효율적으로 검색 및 처리할 수 있습니다.

     
     
    참고]
    LazyCollection은 Laravel의 컬렉션 클래스 중 하나로, 일반적인 Collection과 유사하지만 조금 다른 동작 방식을 갖습니다. LazyCollection은 데이터를 즉시 메모리에 로드하지 않고 필요한 경우에만 처리하는데 중점을 둔 클래스입니다.

    기본적으로 LazyCollection은 레코드를 청크 단위로 로드하며, 필요한 시점에서만 실제로 데이터를 검색합니다. 이는 대량의 데이터를 효율적으로 처리하고, 메모리 사용량을 최적화하는 데 도움이 됩니다. 특히, cursor 메서드를 사용하여 LazyCollection 인스턴스를 생성하면 이러한 동작이 기본적으로 활성화됩니다.

    간단한 예시를 통해 설명하겠습니다. 아래의 코드에서는 LazyCollection을 사용하여 posts 테이블의 데이터를 처리합니다.

     

    use Illuminate\Support\LazyCollection;
    use Illuminate\Support\Facades\DB;

    $posts = DB::table('posts')->orderBy('id')->cursor();

    $posts->each(function ($post) {
        // 실제로 데이터를 처리하는 부분
        echo $post->title;
    });

     

    이 예시에서 cursor 메서드는 LazyCollection 인스턴스를 반환하며, each 메서드는 필요한 시점에서 각 레코드를 처리합니다. 이렇게 함으로써 대량의 데이터를 순회하면서 필요할 때만 메모리에 로드하게 되므로 효율적으로 작업할 수 있습니다.

    댓글

Designed by Tistory.