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