什么是延迟加载?
什么是延迟加载?
[阅读一些答案后进行编辑]
人们为什么如此频繁地使用该术语?
假设我们只使用ASP / ADO记录集,并使用数据或者ADO.NET数据源将其加载到gridview。
我想我应该问为什么人们使用术语"延迟加载",它们是什么"其他"类型?
解决方案
回答
维基百科的定义
延迟加载是计算机编程中常用的一种设计模式,用于将对象的初始化推迟到需要它的时间点。 ...
http://en.wikipedia.org/wiki/Lazy%20loading
回答
延迟加载是一种编程实践,我们仅在首次需要它时才加载或者初始化对象。这有可能极大地提高性能,尤其是在应用程序中有很多组件的情况下。
像往常一样,维基百科有更多详细信息。
回答
这是我写的一些实际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字段中,以便在下次请求时无需重新计算它。
回答
之所以称为"延迟加载",是因为像一个懒惰的人一样,我们推迟执行不想做的事情。相反的是"急切加载",我们可以在需要之前就立即加载某些东西。
如果我们好奇为什么人们可能会使用延迟加载,请考虑一个需要很长时间才能启动的应用程序。这个应用程序可能正在做很多急切的工作……从磁盘上装载东西,然后进行计算等等。
将此与延迟加载进行比较,应用程序将启动得更快,但是第一次执行需要长时间运行的加载时,第一次加载时可能会稍有停顿。因此,通过延迟加载,我们可以在运行应用程序的整个过程中分摊加载时间……实际上,我们可以避免加载用户永远不打算使用的内容。
回答
在谈论对象关系映射器时,通常使用术语惰性加载。如果直接使用ADO.NET,则始终会急于加载(即,它始终会加载我们指定的内容)。
像nHibernate这样的OR映射器支持返回仅在访问数据时"填充"正确数据的代理对象。这样,我们只需加载我们实际使用的数据。当我们指定可以从数据库中加载的对象之间有很多关系,而我们不希望OR映射器加载所有相关对象以及与相关对象相关的对象等等时,此功能很有用。这可能会导致整个数据库被加载。
也可以通过仔细设计对象模型来防止此问题。 (使用聚合并且仅像在域驱动设计中那样加载聚合根是解决此问题而不使用延迟加载的一种方法)。
延迟加载可能导致或者映射器进行大量的小型数据库访问,而不是一次检索我们需要的所有数据。这也可能导致性能问题。
回答
是一种设计模式。
延迟加载:直到代码需要特定对象执行某些操作,对象才会被初始化,并且一旦初始化,它就不会重新初始化该对象,而是使用先前初始化的对象。
这使代码效率更高,并有助于管理内存使用情况。
延迟加载的示例应用程序:
鬼
延迟初始化
价值持有人
回答
延迟加载:我们不会浪费时间(也不会浪费时间)来使用可能不需要的东西。然后,当我们需要它时,它会花费更长的时间,但这很好。
生活中的例子:我们不需要实际学习法语短语手册,而是一次学习一个短语。什么时候有意义?如果我们只是短暂待在法国(例如,我们不需要很多用语),或者我们需要很快离开。如果我们在这里呆了两年,并且/或者我们有很长的学习时间,那么提前学习整个短语集(更容易加载)可能会更有效率。
[受到金星在WKRP上以帮派术语讲授的原子的启发。]
回答
延迟加载是数据库中经常使用的术语,是指仅在需要时才加载部分所需信息的概念。
IE。假设我们需要一个包含多个表的联接的记录。如果我们一次获取所有内容,则比只说主表要花费更长的时间。使用延迟加载,仅在需要时才获取其余信息。因此,在某些情况下,它实际上是"高效加载"。
其他类型的"加载"是:
- 渴望加载-一次加载所有连接的表。
回答
Lazy <T>现在是c4.0的一部分,在MSDN上有一个漂亮的页面来解释这一概念。