Lazy Loading là gì?


91

Lazy Loading là gì?

[Chỉnh sửa sau khi đọc một vài câu trả lời] Tại sao mọi người lại sử dụng thuật ngữ này thường xuyên như vậy?

Giả sử bạn chỉ cần sử dụng bộ bản ghi ASP / ADO và tải nó với dữ liệu hoặc Nguồn dữ liệu ADO.NET cho dạng xem lưới.

Tôi đoán tôi nên hỏi tại sao mọi người sử dụng thuật ngữ Lazy Loading, các loại "khác" của họ là gì?

Câu trả lời:


226

Nó được gọi là tải lười biếng bởi vì, giống như một người lười biếng, bạn đang cố gắng làm điều gì đó mà bạn không muốn. Ngược lại là Eager Loading, nơi bạn tải một thứ gì đó ngay lập tức, rất lâu trước khi bạn cần.

Nếu bạn tò mò tại sao mọi người có thể sử dụng tính năng tải chậm, hãy xem xét một ứng dụng mất LOOOOONG thời gian để khởi động. Ứng dụng này có thể đang thực hiện rất nhiều thao tác tải ... tải mọi thứ từ đĩa, và thực hiện các phép tính và không bao lâu nữa trước khi cần đến.

So sánh điều này với tải chậm, ứng dụng sẽ khởi động nhanh hơn nhiều, nhưng sau đó lần đầu tiên bạn cần làm điều gì đó đòi hỏi một số tải chạy dài, có thể có một chút tạm dừng trong khi tải lần đầu tiên. Do đó, với tính năng tải chậm, bạn đang phân bổ thời gian tải trong suốt quá trình chạy ứng dụng của mình ... và bạn thực sự có thể tiết kiệm từ việc tải những thứ mà người dùng có thể không bao giờ có ý định sử dụng.


@Mike Stone, Xin chào, bạn có thể giải thích khi nào sử dụng tính năng tải lười biếng và háo hức không? Như tôi biết, nếu tôi chạy trình quản lý tệp, nó sẽ sử dụng thiết kế tải chậm.
Alston

40

Lazy Loading là một thực hành lập trình trong đó bạn chỉ tải hoặc khởi tạo một đối tượng khi bạn cần nó lần đầu tiên. Điều này có thể mang lại cho bạn một hiệu suất lớn, đặc biệt nếu bạn có nhiều thành phần trong ứng dụng của mình.

Như thường lệ, Wikipedia có nhiều chi tiết hơn.


14

Tải chậm là một khái niệm trong đó chúng ta trì hoãn việc tải đơn vị đối tượng đến điểm mà chúng ta cần. Nói một cách đơn giản về tải đối tượng theo yêu cầu hơn là tải đối tượng một cách không cần thiết. Ví dụ: nếu bạn có một lớp "Khách hàng" có đối tượng "Đơn hàng" được tổng hợp. Vì vậy, bạn muốn tải dữ liệu khách hàng nhưng các đối tượng đặt hàng mà bạn muốn trì hoãn cho đến khi ứng dụng của bạn cần.

Dưới đây là một video youtube trình bày cách sử dụng lazy loading, cách chúng ta có thể thực hiện lazy loading cũng như những ưu nhược điểm của chúng.

http://www.youtube.com/watch?v=2SrfdAkwmFo



7

Thuật ngữ tải lười biếng thường được sử dụng khi nói về trình ánh xạ quan hệ đối tượng. Nếu bạn sử dụng trực tiếp ADO.NET, bạn luôn nhận được tải nhanh (tức là nó luôn tải chỉ những gì bạn chỉ định).

OR-mappers như nHibernate hỗ trợ trả về các đối tượng proxy chỉ được "điền vào" đúng dữ liệu khi bạn truy cập dữ liệu. Bằng cách đó, bạn chỉ tải dữ liệu mà bạn thực sự sử dụng. Đây là một tính năng hữu ích khi bạn chỉ định nhiều mối quan hệ giữa các đối tượng có thể được tải từ cơ sở dữ liệu, bạn không muốn OR-mapper tải tất cả các đối tượng liên quan và các đối tượng liên quan đến các đối tượng liên quan, v.v. Điều đó có thể dẫn đến toàn bộ cơ sở dữ liệu của bạn được tải.

Vấn đề này cũng có thể được ngăn chặn bằng cách thiết kế cẩn thận mô hình đối tượng của bạn. (sử dụng các tổng hợp và chỉ tải các gốc tổng hợp như trong thiết kế hướng miền là một cách để giải quyết vấn đề này mà không cần tải lười biếng).

Tải chậm có thể dẫn đến hoặc người lập bản đồ thực hiện nhiều truy cập cơ sở dữ liệu nhỏ thay vì truy xuất tất cả dữ liệu bạn cần một lần. Điều này cũng có thể dẫn đến các vấn đề về hiệu suất.


5

Đây là một ví dụ từ một số mã Python thực tế mà tôi đã viết:

class Item(Model):
    ...
    @property
    def total(self):
        if not hasattr(self, "_total"):
            self._total = self.quantity \
                  + sum(bi.quantity for bi in self.borroweditem_set.all())
        return self._total

Về cơ bản, tôi có một lớp Item đại diện cho một mặt hàng trong kho của chúng tôi. Tổng số vật phẩm chúng tôi có là số lượng chúng tôi sở hữu cộng với tổng tất cả các vật phẩm mà chúng tôi đang mượn từ nhiều nguồn khác nhau. Tất cả những con số này đều được lưu trữ trong cơ sở dữ liệu của chúng tôi, và sẽ là vô nghĩa nếu tính toán điều này cho đến khi tổng số thực sự được yêu cầu (vì thường Các mục sẽ được sử dụng mà không yêu cầu tổng số).

Vì vậy, thuộc tính tổng kiểm tra xem trường _total có tồn tại hay không. Nếu không, thì mã thuộc tính sẽ truy vấn cơ sở dữ liệu và tính toán nó, sau đó lưu trữ giá trị trong trường _total để nó không cần được tính lại vào lần sau khi được yêu cầu.


4

Tải chậm: bạn không lãng phí thời gian (cũng như bộ nhớ của mình) với những thứ bạn có thể không cần. Sau đó khi bạn cần thì mất nhiều thời gian hơn nhưng không sao cả.

Ví dụ từ cuộc sống: thay vì thực sự học từ vựng tiếng Pháp đó, bạn học từng cụm từ một khi cần thiết. Khi nào điều này có ý nghĩa? Nếu bạn chỉ đến Pháp trong một thời gian ngắn (tức là bạn sẽ không cần nhiều cụm từ) hoặc nếu bạn cần phải rời đi rất sớm. Nếu bạn ở đó trong hai năm và / hoặc bạn có một thời gian dài để nghiên cứu, thì có thể hiệu quả hơn nhiều nếu bạn chỉ cần học trước toàn bộ từ vựng (đang tải).

[Lấy cảm hứng từ Atom như được Venus dạy về các thuật ngữ băng đảng trên WKRP .]


Không phải lúc nào cũng đúng mà mọi thứ diễn ra lâu hơn. Tôi đã trải nghiệm rằng khi không được triển khai theo cách tối ưu nhất, việc tải chậm thực sự có thể làm chậm một ứng dụng đáng kể.
Captain Sensible

1
@SeventhElement Tôi không tranh cãi rằng nó ổn. Đó là cơ sở để hiểu về tải lười biếng. Trong trường hợp không ổn (ví dụ: vì giao diện người dùng trở nên chậm chạp hoặc vì bất kỳ lý do nào khác), bạn có thể chọn tải nhanh.
Dan Rosenstark,

4

Tải chậm là một thuật ngữ thường được sử dụng trong cơ sở dữ liệu để chỉ khái niệm chỉ tải các phần của thông tin được yêu cầu khi cần thiết.

Tức là bạn cần có một bản ghi có một số bảng kết hợp. Nếu bạn tìm nạp tất cả cùng một lúc, sẽ mất nhiều thời gian hơn nếu bạn tìm nạp chỉ nói bảng chính. Sử dụng tính năng tải chậm, phần còn lại của thông tin sẽ chỉ được tìm nạp nếu cần. Vì vậy, nó thực sự là 'tải hiệu quả' trong một số trường hợp nhất định.

Các loại 'tải' khác là:

  1. Đang tải háo hức - Tải tất cả các bảng được kết nối cùng một lúc.

3

là một Mẫu thiết kế.

Tải chậm: Mã của bạn yêu cầu một số hoạt động được thực hiện bởi một đối tượng cụ thể, đối tượng không được khởi tạo và khi nó được khởi tạo, nó sẽ không khởi tạo lại đối tượng mà sử dụng đối tượng đã khởi tạo trước đó.

Điều này làm cho mã của bạn hiệu quả hơn nhiều và giúp quản lý việc sử dụng bộ nhớ.

Các ứng dụng ví dụ của tải Lazy:

Khởi tạo Ghost Lazy Chủ giá trị


3

Một số ưu điểm của lazy loading:

  1. Giảm thiểu thời gian khởi động của ứng dụng.
  2. Ứng dụng tiêu tốn ít bộ nhớ hơn vì tải theo yêu cầu.
  3. Yêu cầu không cần thiết đến máy chủ được tránh.

2

Ví dụ về Lazy Loading sẽ là một lưới hoặc bảng có nhiều dữ liệu trên trang web để xem nơi ứng dụng chỉ tải kích thước chế độ xem trình duyệt của người dùng tại thời điểm đó. Khi họ cuộn xuống để muốn xem thêm nội dung hoặc dữ liệu, nhiều dữ liệu hơn sẽ được tải vào chế độ xem tại thời điểm đó.

Đây ngày càng trở thành một mẫu thiết kế tương tác / trực quan phổ biến cũng như thông qua ajax hoặc jQuery.

Và như đã đề cập ở trên, ngược lại sẽ là Eager Loading nơi bạn không xem xét đến khách hàng, do đó có khả năng bị ảnh hưởng về hiệu suất.



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.