Що таке ліниве завантаження?


91

Що таке ліниве завантаження?

[Редагувати, прочитавши кілька відповідей] Чому люди так часто використовують цей термін?

Скажімо, ви просто використовуєте набір записів ASP / ADO і завантажуєте його даними або джерелом даних ADO.NET для gridview.

Думаю, мені слід було запитати, чому люди вживають термін «Ледаче завантаження», які «інші» їх типи?

Відповіді:


226

Це називається лінивим завантаженням, тому що, як ледачий, ви відкладаєте щось, чого не хочете. Навпаки - Eager Loading, де ви завантажуєте щось одразу, задовго до того, як вам це потрібно.

Якщо вам цікаво, чому люди можуть використовувати ліниве завантаження, розгляньте програму, яка запускається НАДАТО. Цей додаток, мабуть, робить багато захоплюючого завантаження ... завантажує речі з диска, робить обчислення та багато іншого задовго до того, як він коли-небудь знадобиться.

Порівняйте це з ледачим завантаженням, програма запускатиметься набагато швидше, але тоді, коли вперше вам потрібно зробити щось, що вимагає тривалого навантаження, може виникнути невелика пауза під час завантаження вперше. Таким чином, за допомогою ледачого завантаження ви амортизуєте час завантаження протягом усього запуску програми ... і ви насправді можете врятувати від завантаження речі, які користувач ніколи не має наміру використовувати.


@Mike Stone, Привіт, ти можеш пояснити, коли слід використовувати ледаче та охоче завантаження? Як я знаю, якщо я запускаю менеджер файлів, він використовує лінивий дизайн завантаження.
Алстон,

40

«Ледаче завантаження» - це практика програмування, при якій ви завантажуєте або ініціалізуєте об’єкт лише тоді, коли вам це потрібно. Це потенційно може підвищити продуктивність, особливо якщо у вашому додатку багато компонентів.

Як завжди, Вікіпедія містить більше деталей.


14

Ледаче завантаження - це концепція, коли ми затримуємо завантаження об’єктної одиниці в точці, де нам це потрібно. Додаючи простими словами на вимогу завантаження об’єкта, а не завантаження об’єктів без потреби. Наприклад, якщо у вас є клас "Клієнт", який має об'єднаний об'єкт "Замовлення". Отже, ви хочете завантажувати дані клієнта, але об’єкти замовлень, які ви хотіли б відкласти, поки вашій програмі це не знадобиться.

Нижче наведено відео з YouTube, яке демонструє, як використовувати ліниве завантаження, як ми можемо реалізувати ліниве завантаження та переваги та недоліки того самого.

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


9

Визначення wikipedia Ледаче завантаження - це шаблон дизайну, який зазвичай використовується в комп’ютерному програмуванні для відкладання ініціалізації об’єкта до моменту, коли він необхідний. ...

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


7

Термін ледаче навантаження зазвичай використовують, коли говорять про об'єктні реляційні карти. Якщо ви використовуєте ADO.NET безпосередньо, ви завжди отримуєте бажання завантажуватись (тобто він завжди завантажує саме те, що ви вказали).

АБО-мапери, такі як nHibernate, підтримують повернення об'єктів проксі, які "заповнюються" правильними даними, лише коли ви отримуєте доступ до даних. Таким чином ви завантажуєте лише ті дані, які ви дійсно використовуєте. Це корисна функція, коли ви вказуєте багато зв'язків між об'єктами, які можуть завантажуватися з бази даних, ви не хочете, щоб OR-mapper завантажував усі пов'язані об'єкти та об'єкти, пов'язані з пов'язаними об'єктами тощо. Це може призвести до завантаження всієї вашої бази даних.

Цю проблему можна запобігти за допомогою ретельного проектування вашої об’єктної моделі. (використання агрегатів та завантаження лише коренів сукупності, як у дизайні, керованому доменом, - це спосіб обійти це без використання лінивого завантаження).

Ліниве завантаження може призвести до того, що або mapper зробить безліч дрібних звернень до бази даних, замість того, щоб отримати всі необхідні дані один раз. Це також може спричинити проблеми з продуктивністю.


5

Ось приклад з фактичного коду 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, щоб його не потрібно було перераховувати наступного разу, коли це буде запитано.


4

Ліниве завантаження: ви не витрачаєте свій час (ані пам’ять) на речі, які можуть вам не знадобитися. Тоді, коли вам це потрібно, це займає більше часу, але це нормально.

Приклад із життя: замість того, щоб насправді вивчити той французький розмовник, ви вивчаєте фрази по черзі, як вони потрібні. Коли це має сенс? Якщо ви перебуваєте у Франції лише на короткий час (тобто вам не знадобиться багато фраз), або якщо вам потрібно дуже швидко виїхати. Якщо ви перебуваєте там два роки і / або у вас є тривалий час для навчання, можливо, було б набагато ефективніше просто вивчити весь розмовник заздалегідь (бажання завантажувати).

[Натхненний Атомом, як його викладав Венера на WKRP .]


Не завжди правильно, що це прекрасно, якщо справа триває довше. Я переконався, що коли не реалізовується найбільш оптимальним чином, ліниве завантаження насправді може значно уповільнити програму.
Капітан Розумний

1
@SeventhElement Я не сперечаюся, що це добре. Це основа для розуміння ледачого навантаження. У випадку, коли це не добре (оскільки, наприклад, користувальницький інтерфейс стає млявим або з будь-якої іншої причини), ви можете вибрати нетерпляче завантаження.
Ден Розенстарк,

4

Ледаче завантаження - це термін, який часто використовується в базах даних для позначення поняття завантаження частин необхідної інформації лише тоді, коли це потрібно.

Тобто, припустимо, вам потрібно було мати запис, який має об’єднання кількох таблиць. Якщо ви отримали все одразу, це зайняло б більше часу, ніж якщо б ви взяли, скажімо, лише основну таблицю. За допомогою ледачого завантаження решта інформації буде отримана лише у разі потреби. Тож це насправді є "ефективним завантаженням" у певних сценаріях.

Інші типи "завантаження":

  1. Стрімке завантаження - завантаження всіх підключених таблиць одночасно.

3

- це шаблон дизайну.

Ледаче завантаження: поки ваш код не вимагає певної операції, виконаної певним об’єктом, об’єкт не ініціалізується, і після його ініціалізації він не повторно ініціалізує об’єкт, а використовує раніше ініціалізований об’єкт.

Це робить ваш код набагато ефективнішим і допомагає керувати використанням пам'яті.

Приклади застосування лінивого завантаження:

Привид Ледача ініціалізація Власник значення


3

Деякі переваги лінивого навантаження:

  1. Мінімізує час запуску програми.
  2. Додаток споживає менше пам'яті через завантаження на вимогу.
  3. Уникає непотрібного запиту до сервера.

2

Прикладом Ледачого завантаження може бути сітка або таблиця з великою кількістю даних на веб-сторінці для перегляду, де програма завантажує лише той розмір точки перегляду, який користувач переглядає на той момент. Коли вони прокручують вниз, щоб побачити більше вмісту або даних, на той момент буде завантажено більше даних.

Це стає все більш звичним шаблоном візуального / взаємодії, а також через ajax або jQuery.

І як вже згадувалося вище, протилежним буде Eager Loading, де ви не враховуєте клієнта, таким чином, потенційно може мати хіт продуктивності.



0

На думку geeksforgeeks, «Ледаче завантаження» - це шаблон дизайну програмного забезпечення, при якому ініціалізація об’єкта відбувається лише тоді, коли це насправді потрібно, а не раніше для збереження простоти використання та підвищення продуктивності.

https://www.geeksforgeeks.org/lazy-loading-design-pattern/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.