2008-08-30 52 views
68

Tải Lười biếng là gì?Tải Lười biếng 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 sử dụng thuật ngữ này thường xuyên?

Giả sử bạn chỉ sử dụng bản ghi ASP/ADO và tải nó bằng dữ liệu hoặc ADO.NET Datasource cho chế độ 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, loại "khác" là gì?

Trả lời

180

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 đưa ra làm một cái gì đó bạn không muốn. Ngược lại là tải Eager, nơi bạn tải một cái gì đó ngay lập tức, lâu trước khi bạn cần nó.

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

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

+8

Giải thích tuyệt vời. – Christian

+16

+1 để so sánh với "Eager Loading" –

+0

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

10

Định nghĩa wikipedia Tải trọng lười là mẫu thiết kế thường được sử dụng trong lập trình máy tính để trì hoãn việc khởi tạo đối tượng cho đến thời điểm cần thiết. ...

http://en.wikipedia.org/wiki/Lazy%20loading

35

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

Như thường lệ, Wikipedia có thêm chi tiết.

5

Dưới đây là một ví dụ từ một số mã Python thực tế 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 hàng đại diện cho một mục trong hàng tồn kho của chúng tôi. Tổng số mục chúng tôi có là số mà chúng tôi sở hữu cộng với tổng của tất cả các mục mà chúng tôi đang vay từ nhiều nguồn khác nhau. 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ẽ vô ích khi tính toán cho đến khi tổng số được yêu cầu (vì thường các Mục sẽ được sử dụng mà không cần tổng số yêu cầu).

Vì vậy, tổng số thuộc tính sẽ kiểm tra xem trường _total có tồn tại 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 phải được tính toán lại vào lần tiếp theo nó được yêu cầu.

6

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

OR-người lập bản đồ như hỗ trợ nHibernate trả về các đối tượng proxy được "điền" bằng đú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 rất nhiều 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ân vân. Đ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ó thể được ngăn chặn bằng thiết kế cẩn thận của mô hình đối tượng của bạn. (bằng cách sử dụng cốt liệu và chỉ tải rễ tổng hợp như trong thiết kế điều khiển tên miền là một cách để giải quyết vấn đề này mà không cần sử dụng tải chậm).

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ó thể dẫn đến các vấn đề hiệu suất.

3

là mẫu thiết kế.

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

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

Ví dụ ứng dụng của Lazy tải:

ma khởi Lazy giữ Value

4

Lazy tải: bạn không lãng phí thời gian của bạn (và cũng không nhớ) với những thứ bạn có thể không cần. Sau đó, khi bạn cần nó, phải mất nhiều thời gian, nhưng đó là tốt.

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. Khi nào điều này có ý nghĩa? Nếu bạn chỉ định ở 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 khỏi đây 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, sau đó nó có thể là hiệu quả hơn nhiều để chỉ cần tìm hiểu toàn bộ cuốn sách lên phía trước (háo hức tải).

[Lấy cảm hứng từ Atom as taught in gang terms by Venus on WKRP.]

+0

Không phải lúc nào cũng ổn mà mọi thứ mất nhiều thời gian hơn. Tôi đã có kinh nghiệm rằng khi không được thực hiện một cách tối ưu nhất, tải xuống thực sự có thể làm chậm một ứng dụng đáng kể. –

+1

@ SeventhElement Tôi không cho rằng nó ổn. Đó là cơ sở cho việc hiểu tải chậm. Trong trường hợp không tốt (bởi vì, ví dụ, 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 mong muốn. –

4

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

I.e. giả sử bạn cần có một bản ghi có sự tham gia của nhiều bảng. Nếu bạn tìm nạp tất cả cùng một lúc thì sẽ mất nhiều thời gian hơn nếu bạn chỉ tìm nạp bảng chính. Sử dụ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à 'hiệu quả tải' trong các tình huống nhất định.

Các loại khác của 'bốc' là:

  1. Háo hức tải - tải tất cả các bảng kết nối cùng một lúc.
1

Lazy<T> hiện là một phần của C# 4.0 - có trang đẹp trên MSDN giải thích khái niệm này.

1

Ví dụ về Tải Lười Biếng sẽ là 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 điểm người xem trình duyệt của người dùng vào 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 đó.

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

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

10

Tải trọng lười là một khái niệm mà chúng tôi trì hoãn việc tải đơn vị đối tượng tại điểm mà chúng tôi cần đến. Đặt các từ đơn giản vào tải đối tượng yêu cầu thay vì tải các đối tượng 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 đặt 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 đơn hàng bạn muốn trì hoãn cho đến khi ứng dụng của bạn cần nó.

Dưới đây là video youtube thể hiện cách sử dụng tải chậm, cách chúng tôi có thể triển khai tải và lợi thế và bất lợi của việc tải xuống.

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

2

Một số trong những lợi thế của tải lười biếng:

  1. Giảm thiểu thời gian khởi động của ứng dụng.
  2. Ứng dụng tiêu thụ ít bộ nhớ hơn do tải theo yêu cầu.
  3. Không yêu cầu máy chủ không cần thiết.
Các vấn đề liên quan