2008-08-30 26 views
68

¿Qué es Lazy Loading?¿Qué es Lazy Loading?

[Editar después de leer algunas respuestas] ¿Por qué la gente usa este término tan a menudo?

Supongamos que solo utiliza un conjunto de registros ASP/ADO y lo carga con datos o fuente de datos ADO.NET para una vista de cuadrícula.

Supongo que debería haber preguntado por qué las personas usan el término Carga diferida, ¿qué "otros" tipos son los suyos?

Respuesta

180

Se llama carga lenta porque, como una persona perezosa, pospone hacer algo que no desea. Lo contrario es Eager Loading, donde cargas algo enseguida, mucho antes de que lo necesites.

Si tiene curiosidad acerca de por qué las personas pueden usar la carga diferida, considere una aplicación que demore LOOOOONG para comenzar. Esta aplicación probablemente está cargando mucho ... cargando cosas desde el disco, y haciendo cálculos y mucho antes de que alguna vez se necesite.

Compárese esto con la carga diferida, la aplicación comenzaría mucho más rápido, pero la primera vez que necesita hacer algo que requiera una carga larga, puede haber una pequeña pausa mientras se carga por primera vez. Por lo tanto, con la carga diferida, está amortizando el tiempo de carga a lo largo de la ejecución de la aplicación ... y puede ahorrar para cargar cosas que el usuario nunca intentará usar.

+8

Gran explicación. – Christian

+16

+1 para comparar con "Cargando ansiosamente" –

+0

@Mike Stone, Hola, ¿me puede explicar cuándo usar la carga floja y ansiosa? Como sé, si ejecuto el administrador de archivos, utiliza el diseño de carga diferida. – Stallman

10

wikipedia's Definition Lazy loading es un patrón de diseño comúnmente utilizado en programación de computadora para diferir la inicialización de un objeto hasta el punto en el que se necesita. ...

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

35

Lazy Loading es una práctica de programación en el que sólo la carga o inicializar un objeto la primera vez que lo necesite. Esto puede potencialmente darle un gran aumento de rendimiento, especialmente si tiene muchos componentes en su aplicación.

Como es habitual, Wikipedia tiene más detalles.

5

He aquí un ejemplo de un código Python real escribí:

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 

Básicamente, tengo una clase de artículo que representa un elemento en nuestro inventario. El número total de artículos que tenemos es el número que poseemos más la suma de todos los artículos que estamos pidiendo prestados de varias fuentes. Todos estos números están almacenados en nuestra base de datos, y sería inútil calcular esto hasta que se solicite realmente el total (ya que a menudo los Artículos se usarán sin que se solicite el total).

Por lo que la propiedad total comprueba si existe el campo _total. Si no es así, el código de propiedad consulta la base de datos y la calcula, luego almacena el valor en el campo _total para que no sea necesario recalcular la próxima vez que se solicite.

6

El término "carga lenta" se usa generalmente cuando se habla de mapeadores relacionales de objetos. Si usa ADO.NET directamente, siempre obtiene una carga ansiosa (es decir, siempre carga exactamente lo que usted especifica).

OR-mapeadores como nHibernate admiten la devolución de objetos proxy que se "completan" con los datos correctos solo cuando se accede a los datos. De esta forma solo cargas los datos que realmente usas.Esta es una característica útil cuando especifica muchas relaciones entre objetos que pueden cargarse desde la base de datos, no quiere que OR-mapper cargue todos los objetos relacionados y los objetos relacionados con los objetos relacionados, etc. Eso puede hacer que toda su base de datos se cargue.

Este problema también se puede evitar con un diseño cuidadoso del modelo de objetos. (El uso de agregados y solo cargar raíces de agregado, como en el diseño impulsado por dominio, es una forma de evitar esto sin usar carga diferida).

La carga diferida puede hacer que el o mapeador haga muchos accesos pequeños a la base de datos en lugar de recuperar todos los datos que necesita una vez. Esto también puede causar problemas de rendimiento.

3

es un patrón de diseño.

Carga diferida: hasta que su código requiera alguna operación realizada por un objeto particular, el objeto no se inicializa, y una vez que se inicializa no reinicializa el objeto sino que utiliza el objeto previamente inicializado.

Esto hace que su código sea mucho más eficiente y ayuda a administrar el uso de la memoria.

Ejemplos de aplicaciones de carga: Lazy

fantasma inicialización perezosa titular Valor

4

Lazy carga: que no pierda su tiempo (ni su memoria) con cosas puede que no necesite. Entonces, cuando lo necesites, lleva más tiempo, pero está bien.

Ejemplo de la vida: en lugar de aprender realmente el libro de frases en francés, aprendes las frases de a una por vez, según las necesites. ¿Cuándo tiene sentido esto? Si solo vas a estar en Francia por un tiempo corto (es decir, no necesitarás muchas de las frases) o si necesitas irte muy pronto. Si estás allí por dos años y/o tienes mucho tiempo para estudiar, entonces puede ser mucho más eficiente simplemente aprender todo el libro de frases por adelantado (carga ansiosa).

[Inspirado por el Atom as taught in gang terms by Venus on WKRP.]

+0

No siempre es correcto que esté bien que las cosas tarden más. He experimentado que, cuando no se implementa de la manera más óptima, la carga diferida en realidad puede ralentizar una aplicación de manera significativa. –

+1

@SeventhElement No estoy argumentando que está bien. Es la base para entender la carga diferida. En un caso en el que no está bien (porque, por ejemplo, la IU se vuelve lenta o por cualquier otra razón) puede optar por la carga ansiosa. –

4

Lazy carga es un término usado con frecuencia en las bases de datos para hacer referencia al concepto de partes de carga de la información necesaria sólo cuando se necesita.

I.e. supongamos que necesita tener un registro que tiene una combinación de varias tablas. Si lo buscó todo de una vez, tomaría más tiempo que si buscara decir solo la tabla principal. Con la carga lenta, el resto de la información solo se buscará si es necesario. Entonces, en realidad es 'carga eficiente' en ciertos escenarios.

Los otros tipos de 'carga' es:

  1. Eager Carga - todas las mesas conectados a la vez.
1

Lazy<T> ahora es parte de C# 4.0 - hay una bonita página en MSDN que explica el concepto.

1

Un ejemplo de Lazy Loading sería una cuadrícula o tabla con muchos datos en una página web para ver dónde la aplicación solo carga el tamaño del punto de vista del navegador del usuario en ese momento. Cuando se desplazan hacia abajo para ver más contenido o datos, se cargarán más datos en ese momento.

Esto se está convirtiendo en un patrón de diseño visual/de interacción común también a través de ajax o jQuery.

Y como se mencionó anteriormente, lo contrario sería Eager Loading en el que no se tiene en cuenta al cliente, lo que podría tener un impacto en el rendimiento.

10

Lazy Lazy loading es un concepto en el que demoramos la carga de la unidad de objetos en el punto donde la necesitamos. Poner palabras simples en la carga de objetos de demanda en lugar de cargar los objetos innecesariamente. Por ejemplo, si tiene una clase "Cliente" que tiene agregados objetos "Pedidos". Por lo tanto, le gustaría cargar los datos del cliente pero los objetos de pedido que desea retrasar hasta que su aplicación lo necesite.

A continuación se muestra un video de youtube que muestra cómo utilizar la carga diferida, cómo podemos implementar la carga diferida y las ventajas y desventajas de la misma.

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

2

Algunas de las ventajas de la carga diferida:

  1. Minimiza el tiempo de inicio de la aplicación.
  2. La aplicación consume menos memoria debido a la carga bajo demanda.
  3. Se evita la solicitud innecesaria al servidor.