¿Qué es la carga diferida?


91

¿Qué es la carga diferida?

[Editar después de leer algunas respuestas] ¿Por qué la gente usa este término con tanta frecuencia?

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

Supongo que debería haber preguntado por qué la gente usa el término Carga diferida, ¿qué "otros" tipos son?

Respuestas:


226

Se llama carga diferida porque, como una persona holgazana, estás posponiendo hacer algo que no quieres. Lo opuesto es la carga ansiosa, donde carga algo de inmediato, mucho antes de que lo necesite.

Si tiene curiosidad por saber por qué las personas pueden usar la carga diferida, considere una aplicación que tarde MUCHO tiempo en iniciarse. Esta aplicación probablemente está cargando mucho ... cargando cosas desde el disco y haciendo cálculos y todo eso mucho antes de que sea necesario.

Compare esto con la carga diferida, la aplicación se iniciaría mucho más rápido, pero la primera vez que necesite hacer algo que requiera una carga de ejecución prolongada, 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 durante el transcurso de la ejecución de su aplicación ... y en realidad puede evitar cargar cosas que el usuario quizás nunca pretenda usar.


@ Mike Stone, Hola, ¿puedes explicar cuándo usar la carga perezosa y ansiosa? Como sé, si ejecuto el administrador de archivos, utiliza el diseño de carga diferida.
Alston

40

La carga diferida es una práctica de programación en la que solo carga o inicializa un objeto cuando lo necesita por primera vez. Esto puede potencialmente darle un gran aumento de rendimiento, especialmente si tiene muchos componentes en su aplicación.

Como de costumbre, Wikipedia tiene más detalles.


14

La carga diferida es un concepto en el que retrasamos la carga de la unidad de objeto en el punto donde la necesitamos. Poner en palabras simples sobre la carga de objetos de demanda en lugar de cargar los objetos innecesariamente. Por ejemplo, si tiene una clase "Cliente" que tiene el objeto "Pedidos" agregado. Por lo tanto, le gusta cargar los datos del cliente, pero los objetos de los pedidos le gustaría retrasar hasta que su aplicación los necesite.

A continuación se muestra un video de youtube que demuestra cómo usar 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



7

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

Los mapeadores OR como nHibernate admiten la devolución de objetos proxy que se "completan" con los datos correctos solo cuando accede a los datos. De esa manera, solo carga los datos que realmente usa. Esta es una característica útil cuando especifica muchas relaciones entre objetos que se pueden cargar desde la base de datos, no desea que el mapeador OR cargue todos los objetos relacionados y los objetos relacionados con los objetos relacionados, etc. Eso puede resultar en que se cargue toda su base de datos.

Este problema también se puede prevenir mediante un diseño cuidadoso de su modelo de objetos. (El uso de agregados y solo la carga de raíces agregadas como en el diseño impulsado por dominio es una forma de solucionar esto sin usar la carga diferida).

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


5

Aquí hay un ejemplo de un código Python real que 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 artículo de 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 tomamos prestados de varias fuentes. Todos estos números se almacenan en nuestra base de datos, y no tendría sentido calcular esto hasta que se solicite el total (ya que a menudo los Elementos se utilizarán sin que se solicite el total).

Por tanto, 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 volver a calcularlo la próxima vez que se solicite.


4

Carga diferida: no pierde el tiempo (ni la memoria) con cosas que quizás no necesite. Luego, cuando lo necesita, tarda más, pero está bien.

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

[Inspirado por el átomo como lo enseña Venus en WKRP en términos de pandillas .]


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 significativamente.
Captain Sensible

1
@SeventhElement No estoy diciendo que esté bien. Es la base para comprender la carga diferida. En un caso en el que no esté bien (porque, por ejemplo, la interfaz de usuario se vuelve lenta o por cualquier otro motivo), puede optar por una carga ansiosa.
Dan Rosenstark

4

La carga diferida es un término que se usa con frecuencia en las bases de datos para referirse al concepto de cargar partes de la información requerida solo cuando es necesario.

Supongo que necesita tener un registro que tenga una combinación de varias tablas. Si lo buscara todo a la vez, tomaría más tiempo que si lo buscara, digamos solo la tabla principal. Al utilizar la carga diferida, el resto de la información se obtendrá solo si es necesario. Entonces, en realidad, es una 'carga eficiente' en ciertos escenarios.

Los otros tipos de 'carga' son:

  1. Carga ansiosa: carga todas las tablas conectadas a la vez.

3

es un patrón de diseño.

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

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

Aplicaciones de ejemplo de carga diferida:

Titular del valor de inicialización de Ghost Lazy


3

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.

2

Un ejemplo de carga diferida sería una cuadrícula o tabla con una gran cantidad de 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 querer ver más contenido o datos, se cargarán más datos en la vista en ese momento.

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

Y como se mencionó anteriormente, lo opuesto sería la carga ansiosa, donde no se tiene en cuenta al cliente, por lo que podría tener un impacto en el rendimiento.



Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.