什么是延迟加载?

在阅读一些答案后编辑]为什么人们会经常使用这个术语?

假设您只是使用 ASP/ADO 记录集并使用数据或 ADO.NET 数据源加载它以用于网格视图。

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

有帮助吗?

解决方案

之所以称为延迟加载,是因为就像一个懒人一样,您会推迟做一些您不想做的事情。相反的是预加载,您可以在需要之前就立即加载某些内容。

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

与延迟加载相比,应用程序启动速度会快得多,但是当您第一次需要执行一些需要长时间运行加载的操作时,第一次加载时可能会有轻微的暂停。因此,通过延迟加载,您可以在整个应用程序运行过程中分摊加载时间......并且您实际上可以节省加载用户可能永远不想使用的东西。

其他提示

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

照常, 维基百科 有更多详细信息。

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

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

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

Wikipedia的定义懒负载是计算机编程中通常使用的设计模式,用于将对象的初始化推迟到需要时。...

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

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

像 nHibernate 这样的 OR 映射器支持返回代理对象,仅当您访问数据时,这些代理对象才会被正确的数据“填充”。这样你就只加载你真正使用的数据。当您指定可以从数据库加载的对象之间的大量关系,并且您不希望 OR 映射器加载所有相关对象以及与相关对象相关的对象等等时,这是一个有用的功能。这可能会导致整个数据库被加载。

这个问题也可以通过仔细设计对象模型来避免。(使用聚合并仅加载聚合根,就像在域驱动设计中一样,是一种无需使用延迟加载即可解决此问题的方法)。

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

下面是我编写的一些实际 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 字段中,以便下次请求时不需要重新计算。

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

生活中的例子:您无需实际学习法语短语手册,而是根据需要一次学习一个短语。这什么时候有意义?如果您只会在法国停留很短的时间(即,您不需要很多短语)或者您需要很快离开。如果您在那里呆了两年和/或您有很长的时间来学习,那么预先学习整个短语手册(热切加载)可能会更有效。

[灵感来自于 Venus 在 WKRP 上以帮派术语教授 Atom.]

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

IE。假设您需要一条记录,其中包含多个表的联接。如果您一次获取所有内容,则比仅获取主表需要更长的时间。使用延迟加载,仅在需要时才获取其余信息。所以在某些场景下它实际上是“高效加载”。

其他类型的“加载”是:

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

是一种设计模式。

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

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

延迟加载的示例应用:

幽灵懒惰的初始化价值持有人

延迟加载的一些优点:

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

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

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

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

Lazy<T> 现在是 c# 4.0 的一部分 - 有一个很好的页面 微软软件定义网络 这解释了这个概念。

根据 geeksforgeeks 的说法,延迟加载是一种软件设计模式,其中对象的初始化仅在实际需要时才发生,而不是在此之前,以保持使用的简单性并提高性能。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top