什么是延迟加载?


91

什么是延迟加载?

[阅读一些答案后进行编辑]人们为什么经常使用此术语?

假设您仅使用ASP / ADO记录集,并使用数据或ADO.NET数据源将其加载到gridview。

我想我应该问为什么人们使用术语“延迟加载”,它们是什么“其他”类型?

Answers:


226

之所以称为“延迟加载”,是因为像一个懒惰的人一样,您推迟执行不想做的事情。与之相反的是“急切加载”,您可以在需要时就立即加载某些东西。

如果您好奇为什么人们可能会使用延迟加载,请考虑一个需要很长时间才能启动的应用程序。这个应用程序可能正在做很多急切的工作……从磁盘上装载东西,然后进行计算等等。

将其与延迟加载进行比较,应用程序将启动得更快,但是,当您第一次需要执行需要长时间运行的加载的操作时,首次加载时可能会有一点暂停。因此,通过延迟加载,您可以在运行应用程序的整个过程中分摊加载时间……实际上,您可以避免加载用户永远不会使用的内容。


@Mike Stone,您好,您能解释何时使用懒惰和渴望加载吗?据我所知,如果我运行文件管理器,它将利用延迟加载设计。
2014年

40

延迟加载是一种编程实践,您仅在第一次需要它时才加载或初始化对象。这有可能极大地提高性能,尤其是在应用程序中有很多组件的情况下。

和往常一样,维基百科有更多详细信息。


14

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

以下是一个youtube视频,该视频演示了如何使用延迟加载,如何实现延迟加载及其优点和缺点。

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



7

在谈论对象关系映射器时,通常使用术语惰性加载。如果直接使用ADO.NET,您总是会急于加载(即,它始终会加载您指定的内容)。

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

也可以通过仔细设计对象模型来防止此问题。(像在域驱动设计中那样,使用聚合并且仅加载聚合根是解决此问题而不使用延迟加载的一种方法)。

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


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字段中,以便下次请求时无需重新计算它。


4

延迟加载:您不会浪费时间(也不会浪费您的时间)来使用可能不需要的东西。然后,当您需要它时,它会花费更长的时间,但这很好。

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

[受到金星在WKRP上以帮派术语讲授原子的启发。]


花费更长的时间并不总是对的。我已经体验到,如果没有以最佳方式实现,延迟加载实际上会大大降低应用程序的速度。
明智船长

1
@SeventhElement我不是在争论这很好。它是了解延迟加载的基础。在情况不佳的情况下(例如,由于UI变慢或其他原因),您可以选择快速加载。
丹·罗森斯塔克

4

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

即假设您需要一个包含多个表的联接的记录。如果您一次获取所有内容,则比只说主表要花费更长的时间。使用延迟加载,仅在需要时才获取其余信息。因此,在某些情况下,它实际上是“高效加载”。

其他类型的“加载”是:

  1. 渴望加载-一次加载所有连接的表。

3

是一种设计模式。

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

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

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

Ghost延迟初始化值持有者



2

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

通过ajax或jQuery,这也越来越成为一种常见的视觉/交互设计模式。

如上所述,与之相反的是急切加载,您无需考虑客户端,因此可能会对性能造成影响。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.