什么是延迟加载?

什么是延迟加载?

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

假设你只是使用一个ASP / ADOlogging集,并使用数据或ADO.NET数据源加载gridview。

我想我应该问为什么人们使用“延迟加载”(Lazy Loading)这个词,他们有什么“其他”types?

这就是所谓的懒加载,因为就像一个懒惰的人,你正在做一些你不想做的事情。 与之相反的是Eager Loading,在你需要的时候,你马上就要加载一些东西。

如果您好奇为什么人们可能会使用延迟加载,请考虑一个需要花费一个LOOOOONG时间才能启动的应用程序。 这个应用程序可能正在进行大量的热切加载…从磁盘加载内容,并进行计算,甚至在需要之前。

比较这与懒加载,应用程序将启动更快,但第一次你需要做一些需要一些长时间运行的负载,可能会有一个轻微的暂停,而它是第一次加载。 因此,通过延迟加载,您可以在运行应用程序的整个过程中分摊加载时间…并且实际上可以节省加载用户可能从不打算使用的内容。

延迟加载是一种编程实践,您只需在第一次加载或初始化对象时进行加载。 这可能会给您带来巨大的性能提升,尤其是在应用程序中有很多组件的情况下。

像往常一样, 维基百科有更多的细节。

维基百科的定义延迟加载是计算机编程中常用的一种devise模式,用于将对象的初始化推迟到需要的地方。 …

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

延迟加载是一个概念,我们将对象单元的加载延迟到需要的地方。 用简单的话来说明需求对象加载,而不是不必要地加载对象。 例如,如果您有一个“客户”类具有“订单”对象汇总。 所以你想加载客户数据,但是你想延迟的订单对象,直到你的应用程序需要它。

下面是一个演示如何使用延迟加载的YouTubevideo,我们如何实现延迟加载以及相同的优缺点。

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

在谈论对象关系映射器时,通常使用术语懒加载。 如果您直接使用ADO.NET,则始终会进行急切的加载(即始终加载您指定的内容)。

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

这个问题也可以通过对象模型的devise来防止。 (使用聚合,只加载像在域驱动devise中的聚合根是一种避免使用延迟加载的方法)。

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

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

懒惰的加载:你不会浪费你的时间(或你的记忆)与你可能不需要的东西。 那么当你需要的时候,需要更长的时间,但没关系。

生活中的例子:不是真的学习法语短语,而是一次一个地学习短语。 这是什么意思? 如果你只是在法国短时间(即,你不会需要很多的短语),或者如果你需要很快离开。 如果你在那里呆了两年,或者你有很长的时间去学习,那么只要学习整个短语集(预先加载)就可以高效得多。

[ 由维纳斯在WKRP的帮派术语教导的primefaces的启发。]

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

即假设你需要有一个连接几个表的logging。 如果你一次把它全部提取出来,那要比只读取主表格要花费更长的时间。 只有在需要的时候,使用延迟加载才能获取其余的信息。 所以在某些情况下实际上是“高效加载”。

其他types的“加载”是:

  1. 急切加载 – 一次加载所有连接的表格。

是一种devise模式。

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

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

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

Ghost惰性初始化值持有者

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

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

这通过ajax或jQuery成为一种常见的视觉/交互devise模式。

正如上面提到的,相反的是Eager Loading,你不会考虑客户,因此可能会有一个performance冲击。

延迟加载的一些优点:

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