Hướng dẫn dùng chunk size trong PHP
Show Đã đăng vào thg 12 21, 2018 10:13 SA 2 phút đọc Tại sao chia sẻ điều này?Phương
thức Vấn đề ở đây là gì?Vui lòng xem ví dụ dưới đây: Giả định: tổng số người dùng chưa xử lý là 400 (Id là 1 - 400) Vấn đề là: Chỉ có một nửa số người dùng được xử lý. Phân tíchMỗi chunk đang được fetch thông qua single query sử dụng kết hợp với limit và offset. Chúng ta hãy xem chức năng chunk sẽ hoạt động như thế nào.
Kết quả là: 200 người dùng được xử lý, nhưng 200 người dùng vẫn chưa được xử lý. - Giải phápBạn nên sử dụng phương thức Khi sử dụng Truy vấn chunk thứ nhất: Truy vấn chunk thứ 2: Truy vấn chunk thứ 3: Truy vấn chunk thứ 4: Do đó, kết quả tìm nạp sẽ là 1-100, 101- 200, 201 -300, 301- 400 theo trình tự và tất cả người dùng đều được xử lý. Bài viết được sưu tầm và dịch từ: https://engineering.carsguide.com.au/chunk-be-careful-b19c8197dc4d All rights reserved Facade DBTrong Laravel, khi muốn lấy dữ liệu hoặc xây dựng query thì chúng ta có thể sử dụng facade DB. Khi đi kèm với Vấn đềVới facade DB thì mọi chuyện sẽ khá là dễ dàng và vui
vẻ. Như vậy, nếu muốn lấy tất cả dữ liệu của bảng ChunkGiải pháp cũng khá đơn giản, nếu như mà dữ liệu nhiều quá, load một lần như vậy hao tốn memory quá thì chúng ta sẽ load từ từ, từ từ mà tốn chứ không tốn một lần quá nhiều. Laravel cung cấp cho một giải pháp với tên gọi là Chunk. Ý tưởng khá đơn giản, có một trăm ngàn dữ liệu, thay vì load hết vô memory thì chia nhỏ ra. Có thể chia nhỏ ra thành 100 records mỗi lần, như vậy cứ load 100 records, xong giải phóng dữ liệu rồi sau đó tiếp tục load 100 records tiếp theo. Như vậy, memory chúng ta cần sử dụng sẽ ít hơn khá là nhiều. Thay vì cần dùng 8GB RAM thì với chunk đôi khi chúng ta chỉ cần dùng đến tầm 4GB hoặc 5GB RAM là đẹp. Cách dùng chunk cũng khá đơn giản, viết câu query builder, gọi hàm chunk, pass số lượng record muốn chunk và closure để thực hiện công việc cần thiết vào. Lấy ví dụ mình muốn lấy tất cả post, chunk 100 records mỗi lần và in ra title của post đó thì mình sẽ làm như thế này:
Ngoài ra, chúng ta cũng có thể dừng chunk lại nếu có gì đó sai sai. Giả sử đến record thứ 1000 mình dừng chunk thì mình chỉ cần return false.
Nếu mình cần update dữ liệu trong database thì cân nhắc dùng chunkById sẽ an toàn hơn vì phương thức này sẽ dựa vào primary key của record để mà chunk Bonus thêm streaming lazyNgoài chunk ra, thì
còn có streaming lazy, nó cũng hoạt động na ná. Với phương thức này thì nó sẽ thực thi những câu query ở trong những chunks. Chỉ cần thêm phương thức lazy vào là được và khi thêm lazy thì sẽ trả về kiểu |