12/08/2018, 13:59

Batch processing in Rails

Trong các bài toán, chúng ta thường muốn thao tác với một số lượng lớn các bản ghi, ví dụ như gửi mail tới một nhóm các người dùng, hoặc export dữ liệu... Chúng ta cùng xem xét cách viết dưới đây User . all . each do | user | #do smt with each user #puts user.fullname ...

Trong các bài toán, chúng ta thường muốn thao tác với một số lượng lớn các bản ghi, ví dụ như gửi mail tới một nhóm các người dùng, hoặc export dữ liệu...

Chúng ta cùng xem xét cách viết dưới đây

    User.all.each do |user|
      #do smt with each user
      #puts user.fullname
    end

Cách tiếp cận này rất tồi khi số lượng bản ghi lớn, với User.all.each thì nó sẽ cố gắng khởi tạo ra tất cả các object và lưu trữ tất cả chúng trong bộ nhớ. Nếu số lượng bản ghi đủ lớn có thể vượt quá dung lượng bộ nhớ có thể cung cấp.

Rails với batch processing cho phép người dùng làm việc với một số lượng lớn các bản ghi lưu trữ dưới dạng batch(khối/mẻ) thân thiện với bộ nhớ, giúp giảm dung lượng bộ nhớ cần sử dụng. Có 2 phương thức chính là find_each và find_in_batches

find_each:

    #Each individual record will be sent into block
    User.find_each do |user|
      #do smt with each user
      user.do_smt
    end

find_in_batches:

    #Each batch of record(default 1000 records) will be sent into block
    User.find_in_batches do |user|
      #do smt with each user
      user.do_smt
    end

find_each lấy ra các records theo từng batch(khối) sau đó gọi tới từng record trong khối như là một đối tượng riêng. Quá trình này được lặp đi lặp lại cho tới khi tất cả các record được xử lý xong.

find_in_batches tương tự như find_each khi cũng lấy ra batch các records. Điểm khác biệt ở đây là gọi tới các batches đưa vào trong block dưới dạng một mảng các record thay vì đưa lần lượt từng record vào

0