Co to jest leniwe ładowanie?


91

Co to jest leniwe ładowanie?

[Edytuj po przeczytaniu kilku odpowiedzi] Dlaczego ludzie tak często używają tego terminu?

Załóżmy, że po prostu używasz zestawu rekordów ASP / ADO i ładujesz go z danymi lub źródłem danych ADO.NET dla widoku siatki.

Chyba powinienem był zapytać, dlaczego ludzie używają terminu „leniwe ładowanie”, jakie są ich „inne” typy?

Odpowiedzi:


225

Nazywa się to leniwym ładowaniem, ponieważ jak leniwy człowiek odkładasz zrobienie czegoś, czego nie chcesz. Przeciwieństwem jest Eager Loading, gdzie ładujesz coś od razu, na długo zanim będziesz tego potrzebować.

Jeśli jesteś ciekawy, dlaczego ludzie mogą używać leniwego ładowania, rozważ aplikację, której uruchomienie zajmuje ZA DUŻO czasu. Ta aplikacja prawdopodobnie bardzo chętnie ładuje ... ładuje rzeczy z dysku i wykonuje obliczenia, i to na długo, zanim będzie kiedykolwiek potrzebna.

Porównaj to z leniwym ładowaniem, aplikacja uruchomiłaby się znacznie szybciej, ale wtedy, gdy po raz pierwszy będziesz musiał zrobić coś, co wymaga długiego obciążenia, może wystąpić niewielka przerwa podczas ładowania go po raz pierwszy. Tak więc, przy leniwym ładowaniu, amortyzujesz czas ładowania w trakcie działania aplikacji ... i możesz w rzeczywistości zaoszczędzić na ładowaniu rzeczy, których użytkownik nigdy nie zamierzał używać.


@Mike Stone, Cześć, czy możesz wyjaśnić, kiedy używać leniwego i chętnego ładowania? Jak wiem, jeśli uruchomię menedżera plików, wykorzystuje on leniwy projekt ładowania.
Alston,

40

Ładowanie z opóźnieniem to praktyka programistyczna, w której ładujesz lub inicjujesz obiekt tylko wtedy, gdy go potrzebujesz. Może to potencjalnie dać duży wzrost wydajności, zwłaszcza jeśli masz dużo komponentów w swojej aplikacji.

Jak zwykle Wikipedia ma więcej szczegółów.


14

Leniwe ładowanie to koncepcja, w której opóźniamy ładowanie jednostki obiektu w punkcie, w którym jej potrzebujemy. Mówiąc prostymi słowami, ładowanie obiektu na żądanie zamiast niepotrzebnego ładowania obiektów. Na przykład, jeśli masz klasę „Customer”, która ma zagregowany obiekt „Orders”. Więc lubisz ładować dane klienta, ale obiekty zamówień, które chciałbyś opóźnić, aż aplikacja będzie tego potrzebować.

Poniżej znajduje się film z youtube, który pokazuje, jak korzystać z leniwego ładowania, jak możemy zaimplementować leniwe ładowanie oraz wady i zalety tego samego.

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



7

Termin leniwe ładowanie jest zwykle używany w przypadku mapowania relacyjnego obiektu. Jeśli używasz ADO.NET bezpośrednio, zawsze uzyskujesz chętny ładowanie (tj. Zawsze ładuje tylko to, co określisz).

Operatory odwzorowania OR, takie jak nHibernate, obsługują zwracanie obiektów proxy, które są „wypełniane” odpowiednimi danymi tylko wtedy, gdy uzyskujesz do nich dostęp. W ten sposób ładujesz tylko te dane, których naprawdę używasz. Jest to przydatna funkcja, gdy określasz wiele relacji między obiektami, które mogą być ładowane z bazy danych, nie chcesz, aby element OR-mapper ładował wszystkie powiązane obiekty i obiekty związane z powiązanymi obiektami i tak dalej. Może to spowodować załadowanie całej bazy danych.

Problemowi temu można zapobiec również poprzez staranne zaprojektowanie modelu obiektu. (używanie agregatów i ładowanie tylko zbiorczych korzeni, jak w projektowaniu opartym na domenie, jest sposobem na obejście tego bez korzystania z leniwego ładowania).

Leniwe ładowanie może spowodować, że program lub mapper będzie wykonywał wiele operacji dostępu do małych baz danych zamiast jednorazowo pobierać wszystkie potrzebne dane. Może to również powodować problemy z wydajnością.


5

Oto przykład z prawdziwego kodu Pythona, który napisałem:

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

Zasadniczo mam klasę Item, która reprezentuje przedmiot w naszym ekwipunku. Łączna liczba posiadanych przez nas przedmiotów to liczba, którą posiadamy, oraz suma wszystkich przedmiotów, które pożyczamy z różnych źródeł. Wszystkie te liczby są przechowywane w naszej bazie danych i nie ma sensu obliczać ich, dopóki nie zostanie faktycznie zażądana suma (ponieważ często pozycje będą używane bez żądania łącznej kwoty).

Tak więc właściwość total sprawdza, czy istnieje pole _total. Jeśli tak się nie stanie, kod właściwości wysyła zapytanie do bazy danych i oblicza ją, a następnie przechowuje wartość w polu _total, aby nie trzeba było jej ponownie obliczać przy następnym żądaniu.


4

Leniwe ładowanie: nie marnujesz czasu (ani pamięci) na rzeczy, których możesz nie potrzebować. Potem, kiedy tego potrzebujesz, trwa to dłużej, ale to w porządku.

Przykład z życia: zamiast uczyć się tego francuskiego słownika, uczysz się zwrotów pojedynczo, jeśli są potrzebne. Kiedy to ma sens? Jeśli zamierzasz przebywać we Francji tylko przez krótki czas (tj. Nie będziesz potrzebować wielu zwrotów) lub jeśli musisz wyjechać bardzo szybko. Jeśli jesteś tam przez dwa lata i / lub masz dużo czasu na naukę, o wiele skuteczniejsze może być po prostu nauczenie się całego słownika z góry (szybkie ładowanie).

[Zainspirowany Atomem, jak nauczał w kategoriach gangów Venus w WKRP .]


Nie zawsze jest dobrze, że wszystko trwa dłużej. Doświadczyłem, że leniwe ładowanie może znacznie spowolnić aplikację, jeśli nie jest zaimplementowane w najbardziej optymalny sposób.
Kapitan Sensible

1
@SeventhElement Nie twierdzę, że jest w porządku. To podstawa zrozumienia leniwego ładowania. W przypadku, gdy nie jest to w porządku (ponieważ na przykład interfejs użytkownika staje się powolny lub z innego powodu), możesz zdecydować się na szybkie ładowanie.
Dan Rosenstark

4

Ładowanie z opóźnieniem to termin często używany w bazach danych w odniesieniu do koncepcji ładowania części wymaganych informacji tylko wtedy, gdy jest to potrzebne.

Przypuszczam, że potrzebujesz rekordu, który ma połączenie kilku tabel. Jeśli pobrałbyś to wszystko na raz, zajęłoby to więcej czasu niż gdybyś ściągnął, powiedzmy tylko główną tabelę. Reszta informacji zostanie pobrana tylko wtedy, gdy będzie potrzebna, używając ładowania z opóźnieniem. W niektórych sytuacjach jest to więc „wydajne ładowanie”.

Inne rodzaje „ładowania” to:

  1. Eager Loading - ładowanie wszystkich połączonych tabel na raz.

3

jest wzorcem projektowym.

Ładowanie z opóźnieniem: dopóki kod nie będzie wymagał jakiejś operacji wykonanej przez określony obiekt, obiekt nie jest inicjowany, a po zainicjowaniu nie inicjuje ponownie obiektu, ale używa wcześniej zainicjowanego obiektu.

Dzięki temu kod jest znacznie wydajniejszy i pomaga w zarządzaniu zużyciem pamięci.

Przykładowe zastosowania leniwego ładowania:

Posiadacz wartości inicjalizacji Ghost Lazy


3

Niektóre zalety leniwego ładowania:

  1. Minimalizuje czas uruchamiania aplikacji.
  2. Aplikacja zużywa mniej pamięci z powodu ładowania na żądanie.
  3. Unika się niepotrzebnych żądań do serwera.

2

Przykładem leniwego ładowania może być siatka lub tabela z dużą ilością danych na stronie internetowej, aby zobaczyć, gdzie aplikacja ładuje tylko taki rozmiar punktu widzenia przeglądarki użytkownika, jaki jest w danym momencie. Kiedy przewijają w dół, aby zobaczyć więcej treści lub danych, w tym momencie zostanie załadowanych więcej danych.

Staje się to coraz bardziej powszechnym wzorcem projektowania wizualnego / interakcji, a także za pośrednictwem ajax lub jQuery.

Jak wspomniano powyżej, przeciwieństwem byłoby Zachłanne ładowanie, w którym nie bierzesz pod uwagę klienta, co potencjalnie może mieć wpływ na wydajność.



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.