Was ist Lazy Loading?


91

Was ist Lazy Loading?

[Nach dem Lesen einiger Antworten bearbeiten] Warum wird dieser Begriff so oft verwendet?

Angenommen, Sie verwenden nur ein ASP / ADO-Recordset und laden es mit Daten oder ADO.NET-Datenquelle für eine Rasteransicht.

Ich denke, ich hätte fragen sollen, warum Leute den Begriff Lazy Loading verwenden, welche "anderen" Typen sind ihre?

Antworten:


226

Es heißt Lazy Loading, weil Sie wie eine faule Person etwas aufschieben, was Sie nicht wollen. Das Gegenteil ist Eager Loading, bei dem Sie etwas sofort laden, lange bevor Sie es brauchen.

Wenn Sie neugierig sind, warum Benutzer möglicherweise verzögert laden, ziehen Sie eine Anwendung in Betracht, deren Start LOOOOONG einige Zeit in Anspruch nimmt. Diese Anwendung lädt wahrscheinlich sehr viel ... lädt Dinge von der Festplatte und führt Berechnungen durch und so lange, bis sie jemals benötigt wird.

Vergleichen Sie dies mit dem verzögerten Laden, die Anwendung würde viel schneller starten, aber wenn Sie zum ersten Mal etwas tun müssen, das eine lange Ladezeit erfordert, kann es beim ersten Laden zu einer leichten Pause kommen. Wenn Sie also verzögert laden, wird die Ladezeit im Verlauf der Ausführung Ihrer Anwendung amortisiert ... und Sie können tatsächlich vor dem Laden von Dingen sparen, die der Benutzer möglicherweise nie verwenden möchte.


@ Mike Stone, Hallo, kannst du erklären, wann du faul und eifrig laden sollst? Wie ich weiß, wird beim Ausführen des Dateimanagers das verzögerte Ladedesign verwendet.
Alston

40

Lazy Loading ist eine Programmierpraxis, bei der Sie ein Objekt nur laden oder initialisieren, wenn Sie es zum ersten Mal benötigen. Dies kann möglicherweise zu einer erheblichen Leistungssteigerung führen, insbesondere wenn Ihre Anwendung viele Komponenten enthält.

Wie üblich hat Wikipedia mehr Details.


14

Lazy Loading ist ein Konzept, bei dem wir das Laden der Objekteinheit an dem Punkt verzögern, an dem wir sie benötigen. Einfache Worte bei Bedarf in das Laden von Objekten einfügen, anstatt die Objekte unnötig zu laden. Zum Beispiel, wenn Sie eine "Customer" -Klasse haben, in der das Objekt "Orders" aggregiert ist. Sie möchten also die Kundendaten laden, aber die Auftragsobjekte, die Sie verzögern möchten, bis Ihre Anwendung sie benötigt.

Im Folgenden finden Sie ein Youtube-Video, das zeigt, wie Sie das verzögerte Laden verwenden, wie wir das verzögerte Laden implementieren können und welche Vor- und Nachteile dies hat.

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



7

Der Begriff "Lazy Loading" wird normalerweise verwendet, wenn es um objektrelationale Mapper geht. Wenn Sie ADO.NET direkt verwenden, wird das Laden immer eifrig (dh es wird immer genau das geladen, was Sie angegeben haben).

OR-Mapper wie nHibernate unterstützen die Rückgabe von Proxy-Objekten, die nur dann mit den richtigen Daten "gefüllt" werden, wenn Sie auf die Daten zugreifen. Auf diese Weise laden Sie nur die Daten, die Sie wirklich verwenden. Dies ist eine nützliche Funktion, wenn Sie viele Beziehungen zwischen Objekten angeben, die aus der Datenbank geladen werden können. Sie möchten nicht, dass der OR-Mapper alle zugehörigen Objekte und die mit den zugehörigen Objekten verbundenen Objekte usw. lädt. Dies kann dazu führen, dass Ihre gesamte Datenbank geladen wird.

Dieses Problem kann auch durch sorgfältiges Design Ihres Objektmodells verhindert werden. (Die Verwendung von Aggregaten und nur das Laden von Aggregatwurzeln wie beim domänengesteuerten Design ist eine Möglichkeit, dies zu umgehen, ohne das verzögerte Laden zu verwenden.)

Das verzögerte Laden kann dazu führen, dass der oder der Mapper viele kleine Datenbankzugriffe ausführt, anstatt alle benötigten Daten einmal abzurufen. Dies kann auch zu Leistungsproblemen führen.


5

Hier ist ein Beispiel aus einem tatsächlichen Python-Code, den ich geschrieben habe:

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

Grundsätzlich habe ich eine Artikelklasse, die einen Artikel in unserem Inventar darstellt. Die Gesamtzahl der Artikel, die wir haben, ist die Anzahl, die wir besitzen, plus die Summe aller Artikel, die wir aus verschiedenen Quellen ausleihen. Diese Zahlen werden alle in unserer Datenbank gespeichert, und es wäre sinnlos, dies zu berechnen, bis die Gesamtsumme tatsächlich angefordert wird (da häufig Elemente verwendet werden, ohne dass die Gesamtsumme angefordert wird).

Die Eigenschaft total prüft also, ob das Feld _total vorhanden ist. Ist dies nicht der Fall, fragt der Eigenschaftscode die Datenbank ab und berechnet sie. Anschließend wird der Wert im Feld _total gespeichert, sodass er bei der nächsten Anforderung nicht neu berechnet werden muss.


4

Faules Laden: Sie verschwenden Ihre Zeit (und Ihr Gedächtnis) nicht mit Dingen, die Sie möglicherweise nicht benötigen. Wenn Sie es dann brauchen, dauert es länger, aber das ist in Ordnung.

Beispiel aus dem Leben: Anstatt diesen französischen Sprachführer tatsächlich zu lernen, lernen Sie die Sätze nacheinander, je nach Bedarf. Wann macht das Sinn? Wenn Sie nur für kurze Zeit in Frankreich sein werden (dh Sie werden nicht viele Sätze brauchen) oder wenn Sie sehr bald gehen müssen. Wenn Sie zwei Jahre dort sind und / oder viel Zeit zum Lernen haben, ist es möglicherweise viel effizienter, den gesamten Sprachführer im Voraus zu lernen (eifriges Laden).

[Inspiriert vom Atom, wie es von Venus auf WKRP in Gang-Begriffen gelehrt wurde .]


Es ist nicht immer richtig, dass es in Ordnung ist, dass die Dinge länger dauern. Ich habe die Erfahrung gemacht, dass ein verzögertes Laden eine Anwendung erheblich verlangsamen kann, wenn sie nicht optimal implementiert wird.
Captain Sensible

1
@SeventhElement Ich behaupte nicht, dass es in Ordnung ist. Es ist die Basis für das Verständnis von Lazy Loading. In einem Fall, in dem dies nicht in Ordnung ist (weil beispielsweise die Benutzeroberfläche träge wird oder aus einem anderen Grund), können Sie sich für das eifrige Laden entscheiden.
Dan Rosenstark

4

Lazy Loading ist ein Begriff, der in Datenbanken häufig verwendet wird, um sich auf das Konzept zu beziehen, Teile der erforderlichen Informationen nur dann zu laden, wenn sie benötigt werden.

Angenommen, Sie benötigen einen Datensatz, der aus mehreren Tabellen besteht. Wenn Sie alles auf einmal abrufen würden, würde es länger dauern, als wenn Sie nur die Haupttabelle abrufen würden. Beim verzögerten Laden werden die restlichen Informationen nur abgerufen, wenn sie benötigt werden. In bestimmten Szenarien wird es also tatsächlich effizient geladen.

Die anderen Arten des "Ladens" sind:

  1. Eifriges Laden - Laden aller verbundenen Tabellen gleichzeitig.

3

ist ein Designmuster.

Verzögertes Laden: Bis Ihr Code eine Operation erfordert, die von einem bestimmten Objekt ausgeführt wird, wird das Objekt nicht initialisiert, und sobald es initialisiert ist, wird das Objekt nicht neu initialisiert, sondern das zuvor initialisierte Objekt verwendet.

Dies macht Ihren Code viel effizienter und hilft bei der Verwaltung der Speichernutzung.

Beispielanwendungen für Lazy Loading:

Ghost Lazy Initialisierung Werthalter


3

Einige der Vorteile des verzögerten Ladens:

  1. Minimiert die Startzeit der Anwendung.
  2. Die Anwendung verbraucht aufgrund des On-Demand-Ladens weniger Speicher.
  3. Unnötige Anfragen an den Server werden vermieden.

2

Ein Beispiel für Lazy Loading wäre ein Raster oder eine Tabelle mit vielen Daten auf einer Webseite, um anzuzeigen, wo die Anwendung nur die Größe des Browser-Ansichtspunkts des Benutzers zu diesem Zeitpunkt lädt. Wenn sie nach unten scrollen, um mehr Inhalte oder Daten anzuzeigen, werden in diesem Moment mehr Daten in die Ansicht geladen.

Dies wird auch über Ajax oder jQuery immer häufiger zu einem gängigen visuellen / Interaktionsdesignmuster.

Und wie oben erwähnt, wäre das Gegenteil das eifrige Laden, bei dem Sie den Client nicht berücksichtigen und möglicherweise einen Leistungseinbruch erleiden.



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.