什麼是延遲加載?什麼是延遲加載?
[編輯看完幾個答案後] 爲什麼人們經常使用這個術語?假設你只是使用一個ASP/ADO記錄集並將其與數據或ADO.NET數據源一起加載到一個GridView中。
我想我應該問爲什麼人們使用術語懶加載,什麼「其他」類型是他們?
什麼是延遲加載?什麼是延遲加載?
[編輯看完幾個答案後] 爲什麼人們經常使用這個術語?假設你只是使用一個ASP/ADO記錄集並將其與數據或ADO.NET數據源一起加載到一個GridView中。
我想我應該問爲什麼人們使用術語懶加載,什麼「其他」類型是他們?
它被稱爲延遲加載,因爲就像一個懶惰的人,你正在推遲你不想做的事情。與之相反的是Eager Loading,在你需要它之前很早就加載了一些東西。
如果你很好奇爲什麼人們可能會使用延遲加載,那麼考慮一個需要一段LOOOOONG時間才能啓動的應用程序。這個應用程序可能會進行大量的熱切加載......從磁盤加載內容,進行計算以及在不需要的時間之前進行計算。
將此與延遲加載比較,應用程序啓動速度會快得多,但是當您第一次需要做某些需要長時間運行的負載時,第一次加載時可能會稍微暫停。因此,通過延遲加載,您可以在整個運行應用程序的過程中分攤加載時間......並且實際上可以節省加載用戶可能從不打算使用的內容。
維基百科的定義 延遲加載是一種計算機編程中常用的設計模式,用於推遲對象的初始化,直到需要它的點。 ...
延遲加載是一種編程實踐中,你只能負荷或當你第一次需要初始化的對象。這可能會給您帶來巨大的性能提升,尤其是在應用程序中有很多組件的情況下。
像往常一樣,Wikipedia有更多的細節。
下面是一些實際的Python代碼我寫了一個例子:
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
基本上,我有這代表了我們的庫存中的項目的項目類。我們擁有的物品總數是我們擁有的數量加上我們從各種來源借入的所有物品的總和。這些數字都存儲在我們的數據庫中,直到實際請求總數才計算出來是毫無意義的(因爲經常使用項目而沒有請求總數)。
因此,總屬性檢查_total字段是否存在。如果沒有,則屬性代碼查詢數據庫並計算它,然後將該值存儲在_total字段中,以便在下次請求時不需要重新計算它。
術語惰性加載通常用在討論對象關係映射器時。如果您直接使用ADO.NET,則始終會進行急切的加載(即它總是加載您指定的內容)。
像nHibernate這樣的OR映射程序支持返回代理對象,只有在訪問數據時纔會使用正確的數據「填充」。這樣你只加載你真正使用的數據。當您指定可以從數據庫加載的對象之間的很多關係時,這是一個有用的功能,您不希望OR映射器加載所有相關對象以及與相關對象相關的對象等。這可能會導致您的整個數據庫被加載。
這個問題也可以通過您的對象模型的carefull設計來防止。 (使用聚合和只加載像在域驅動設計中的聚合根是一種避免使用延遲加載的方法)。
延遲加載會導致或映射器執行大量小型數據庫訪問,而不是檢索您需要的所有數據。這也可能導致性能問題。
是一種設計模式。
延遲加載:直到代碼需要由特定對象完成一些操作,對象不會被初始化,並且一旦它被初始化,它不會重新初始化對象,而是使用先前初始化的對象。
這使您的代碼更有效率,並幫助管理內存使用情況。延遲加載的
應用實例:
鬼 延遲初始化 值保持
延遲加載:你不東西,你可能不需要浪費時間(也不是你的內存)。然後,當你需要它時,需要更長的時間,但那很好。
生活中的例子:不是實際學習法語短語手冊,而是根據需要一次學習一個短語。這是什麼意思?如果你只想在法國待上一段時間(即,你不需要很多短語),或者你需要很快離開。如果你在那裏呆了兩年,或者你有很長的時間去學習,那麼學習整個短語手冊可能會更有效率(急切加載)。
延遲加載數據庫中經常用來指的精選僅在需要時所需的信息的裝載部分的概念的術語。
I.e.假設你需要有一個包含多個表的連接的記錄。如果你一次提取所有數據,比只讀取主表格要花費更多的時間。使用延遲加載時,只有在需要時纔會提取其餘的信息。所以在某些情況下它實際上是「高效加載」。
其他類型的「加載」的是:
延遲加載的示例將是一個網格或表,其中包含大量網頁上的數據,以查看應用程序只加載用戶瀏覽器視點大小的時間。當他們向下滾動以查看更多內容或數據時,更多數據將在此時加載到視圖中。
通過ajax或jQuery,它正變得越來越普遍的視覺/交互設計模式。
而且如上所述,相反的是Eager Loading,您不會考慮客戶,因此可能會有性能問題。
延遲加載是一個概念,我們將對象單元的加載延遲到需要它的位置。用簡單的話來說明需求對象加載而不是不必要地加載對象。例如,如果您有一個「客戶」類具有「訂單」對象彙總。因此,您希望加載客戶數據,但希望延遲的訂單對象直到您的應用程序需要它。
下面是一個youtube視頻,演示如何使用延遲加載,如何實現延遲加載以及相同的優缺點。
一些延遲加載的優點:
很好的解釋。 – Christian 2011-06-16 10:10:37
+1與「渴望加載」 – 2011-09-14 19:00:11