Что такое Ленивая загрузка? - PullRequest
82 голосов
/ 30 августа 2008

Что такое Ленивая загрузка?

[Изменить после прочтения нескольких ответов] Почему люди используют этот термин так часто?

Допустим, вы просто используете набор записей ASP / ADO и загружаете его с данными или источником данных ADO.NET для просмотра сетки.

Полагаю, мне следовало бы спросить, почему люди используют термин "Ленивая загрузка", какие у них "другие" типы?

Ответы [ 13 ]

210 голосов
/ 30 августа 2008

Это называется ленивой загрузкой, потому что, как ленивый человек, вы откладываете делать то, чего не хотите. Напротив, Eager Loading, где вы загружаете что-то сразу, задолго до того, как вам это нужно.

Если вам любопытно, почему люди могут использовать ленивую загрузку, рассмотрите приложение, которое запускается через LOOOOONG. Это приложение, вероятно, много загружается ... загружает данные с диска, выполняет вычисления и еще много чего задолго до того, как это понадобится.

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

40 голосов
/ 30 августа 2008

Ленивая загрузка - это практика программирования, при которой вы загружаете или инициализируете объект только тогда, когда вам это нужно Это потенциально может значительно повысить производительность, особенно если в вашем приложении много компонентов.

Как обычно, Википедия содержит более подробную информацию.

14 голосов
/ 14 сентября 2013

Ленивая загрузка - это концепция, в которой мы откладываем загрузку объекта до точки, в которой мы нуждаемся. Ввод простых слов по требованию загрузки объекта, а не загрузки объектов без необходимости. Например, если у вас есть класс «Клиент», в котором агрегирован объект «Заказы». Таким образом, вы хотите загрузить данные о клиентах, но объекты заказов, которые вы хотели бы отложить до тех пор, пока это не понадобится вашему приложению.

Ниже приведено видео на YouTube, демонстрирующее, как использовать отложенную загрузку, как мы можем реализовать отложенную загрузку, а также преимущества и недостатки того же.

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

9 голосов
/ 30 августа 2008

Определение Википедии Ленивая загрузка - это шаблон проектирования, обычно используемый в компьютерном программировании для отсрочки инициализации объекта до точки, в которой он необходим. ...

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

6 голосов
/ 31 августа 2008

Термин отложенная загрузка обычно используется, когда речь идет об объектных реляционных преобразователях. Если вы используете ADO.NET напрямую, вы всегда будете загружены (то есть всегда загружает только то, что вы указали).

OR-сопоставители, такие как nHibernate, поддерживают возврат прокси-объектов, которые «заполняются» правильными данными только при доступе к ним. Таким образом, вы загружаете только те данные, которые действительно используете. Это полезная функция, когда вы указываете много связей между объектами, которые могут быть загружены из базы данных, вы не хотите, чтобы OR-mapper загружал все связанные объекты и объекты, связанные со связанными объектами, и так далее. Это может привести к загрузке всей базы данных.

Эту проблему можно предотвратить с помощью тщательного проектирования вашей объектной модели. (использование агрегатов и загрузка только корней агрегатов, как в доменном дизайне, - это способ обойти это без ленивой загрузки).

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

5 голосов
/ 30 августа 2008

Вот пример из некоторого реального кода 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

По сути, у меня есть класс Предметов, который представляет предмет в нашем инвентаре. Общее количество предметов, которое у нас есть, это число, которым мы владеем, плюс сумма всех предметов, которые мы заимствуем из различных источников. Все эти числа хранятся в нашей базе данных, и было бы бессмысленно рассчитывать это до тех пор, пока не будет фактически запрошена общая сумма (поскольку часто элементы будут использоваться без запрошенной суммы).

Таким образом, свойство total проверяет, существует ли поле _total. Если это не так, то код свойства запрашивает базу данных и вычисляет ее, затем сохраняет значение в поле _total, чтобы его не нужно было пересчитывать при следующем запросе.

4 голосов
/ 15 августа 2009

Ленивая загрузка - это термин, часто используемый в базах данных для обозначения концепции загрузки частей необходимой информации только тогда, когда это необходимо.

т.е. Предположим, вам нужно иметь запись, объединяющую несколько таблиц. Если вы загрузили все сразу, это заняло бы больше времени, чем если бы вы выбирали, скажем, только основной стол. При использовании отложенной загрузки остальная информация будет извлечена, только если это необходимо. Так что на самом деле это «эффективная загрузка» в определенных сценариях.

Другие типы «загрузки»:

  1. Стремительная загрузка - загрузка всех подключенных таблиц одновременно.
4 голосов
/ 22 июля 2009

Ленивая загрузка: вы не тратите свое время (ни свою память) на вещи, которые вам могут не понадобиться. Тогда, когда вам это нужно, это занимает больше времени, но это нормально.

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

[Вдохновленный Атомом, как в терминах банды учил Венера на WKRP .]

3 голосов
/ 02 февраля 2016

Некоторые преимущества ленивой загрузки:

  1. Минимизирует время запуска приложения.
  2. Приложение использует меньше памяти из-за загрузки по требованию.
  3. Избегать ненужных запросов к серверу.
3 голосов
/ 22 июля 2009

- это шаблон проектирования.

Ленивая загрузка: пока ваш код требует какой-либо операции, выполняемой определенным объектом, объект не инициализируется, и после его инициализации он не повторно инициализирует объект, а использует ранее инициализированный объект.

Это делает ваш код намного более эффективным и помогает управлять использованием памяти.

Примеры приложений с отложенной загрузкой:

Призрак Ленивая инициализация Держатель стоимости

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...