什么是懒惰加载?

时间:2008-08-30 19:20:05

标签: data-binding lazy-loading

什么是延迟加载?

[阅读几个答案后编辑] 为什么人们经常使用这个术语?

假设您只是使用ASP / ADO记录集并使用数据或ADO.NET数据源加载它以进行gridview。

我想我应该问为什么人们使用“懒惰加载”一词,“其他”类型是什么?

13 个答案:

答案 0 :(得分:210)

它被称为延迟加载,因为,就像一个懒惰的人,你正在推迟做你不想做的事情。相反的是Eager Loading,您可以在需要之前立即加载一些东西。

如果您好奇为什么人们可能会使用延迟加载,请考虑一个需要LOOOOONG时间才能启动的应用程序。这个应用程序可能正在进行大量的热切加载......从磁盘加载东西,进行计算以及在需要之前很久。

将此与延迟加载相比较,应用程序启动速度会快得多,但是当您第一次需要执行需要长时间运行负载的操作时,第一次加载时可能会有轻微停顿。因此,使用延迟加载,您将在运行应用程序的整个过程中分摊加载时间......实际上,您可能无法加载用户可能永远不会使用的内容。

答案 1 :(得分:40)

延迟加载是一种编程实践,您只需在第一次需要时加载或初始化对象。这可能会给您带来很大的性能提升,特别是如果您的应用程序中有很多组件。

像往常一样,Wikipedia有更多细节。

答案 2 :(得分:14)

延迟加载是一个概念,我们将对象单元的加载延迟到我们需要它的位置。在需求对象加载时加入简单的单词而不是不必要地加载对象。例如,如果您有一个“客户”类,其中聚合了“订单”对象。因此,您希望加载客户数据,但是您希望延迟订单对象,直到您的应用程序需要它为止。

下面是一个YouTube视频,演示了如何使用延迟加载,如何实现延迟加载以及它们的优缺点。

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

答案 3 :(得分:9)

维基百科的定义 延迟加载是计算机编程中常用的设计模式,用于将对象的初始化推迟到需要它的点。 ...

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

答案 4 :(得分:6)

在谈论对象关系映射器时,通常使用术语延迟加载。如果你直接使用ADO.NET,你总是会得到热切的加载(即它总是只加载你指定的内容)。

像nHibernate这样的OR-mappers支持返回代理对象,只有在访问数据时才能使用正确的数据“填充”。这样您只需加载您真正使用的数据。当您在可以从数据库加载的对象之间指定很多关系时,这是一个非常有用的功能,您不希望OR映射器加载所有相关对象以及与相关对象相关的对象,依此类推。这可能导致整个数据库被加载。

通过仔细设计对象模型也可以防止出现此问题。 (使用聚合并只加载像域驱动设计中的聚合根,这是一种在不使用延迟加载的情况下解决这个问题的方法。)

延迟加载可能导致或映射器执行大量小型数据库访问,而不是检索一次所需的所有数据。这也可能导致性能问题。

答案 5 :(得分:5)

以下是我编写的一些实际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

基本上,我有一个Item类,它代表我们库存中的一个项目。我们拥有的物品总数是我们拥有的数量加上我们从各种来源借来的所有物品的总和。这些数字都存储在我们的数据库中,在实际请求总数之前计算它是没有意义的(因为通常会使用项目而不会请求总数)。

因此total属性检查_total字段是否存在。如果没有,则属性代码查询数据库并计算它,然后将值存储在_total字段中,以便下次请求时不需要重新计算它。

答案 6 :(得分:4)

延迟加载:你不要浪费你的时间(也不要浪费你的记忆)你可能不需要的东西。然后当你需要它时,它需要更长的时间,但那没关系。

生活中的例子:您不是实际学习法语短语,而是在需要时一次学习一个短语。什么时候有意义?如果你只是短时间在法国(即你不需要很多短语),或者你需要很快离开。如果你在那里待了两年和/或你有很长的时间学习,那么预先学习整本短语可能会更有效率(渴望加载)。

[受Atom as taught in gang terms by Venus on WKRP启发。]

答案 7 :(得分:4)

延迟加载是数据库中经常使用的术语,指的是仅在需要时加载所需信息部分的概念。

即。假设您需要一个具有多个表连接的记录。如果你一次性获取它,它将花费更长的时间,而不是只提取主表。使用延迟加载时,只有在需要时才会获取其余信息。因此,在某些情况下,它实际上是“高效负载”。

其他类型的“加载”是:

  1. 预先加载 - 一次加载所有连接的表格。

答案 8 :(得分:3)

是一种设计模式。

延迟加载:直到您的代码需要某个特定对象执行某些操作,对象未初始化,并且一旦初始化它就不会重新初始化对象,而是使用先前初始化的对象。

这使您的代码更有效,并有助于管理内存使用。

延迟加载的示例应用程序:

鬼 延迟初始化 价值持有人

答案 9 :(得分:3)

延迟加载的一些优点:

  1. 最大限度地缩短应用程序的启动时间。
  2. 由于按需加载,应用程序消耗的内存较少。
  3. 避免向服务器发出不必要的请求。

答案 10 :(得分:2)

延迟加载的一个示例是网格或表,其中包含网页上的大量数据,以查看应用程序仅加载当时用户浏览器视点大小的位置。当他们向下滚动以查看更多内容或数据时,此时会有更多数据加载到视图中。

这通过ajax或jQuery变得更像是一种常见的视觉/交互设计模式。

如上所述,相反的是Eager Loading,您不会考虑客户,因此可能会影响性能。

答案 11 :(得分:1)

Lazy<T>现在是c#4.0的一部分 - MSDN上有一个很好的页面解释了这个概念。

答案 12 :(得分:0)

根据geeksforgeeks,延迟加载是一种软件设计模式,其中,仅在实际需要时才进行对象的初始化,而不是在保持使用简便性和提高性能之前,才进行对象的初始化。

https://www.geeksforgeeks.org/lazy-loading-design-pattern/