Qu'est-ce que le chargement paresseux?


91

Qu'est-ce que le chargement paresseux?

[Modifier après avoir lu quelques réponses] Pourquoi les gens utilisent-ils ce terme si souvent?

Supposons que vous utilisiez simplement un jeu d'enregistrements ASP / ADO et que vous le chargiez avec des données ou une source de données ADO.NET pour une vue en grille.

J'imagine que j'aurais dû demander pourquoi les gens utilisent le terme de chargement paresseux, quels sont les «autres» types?

Réponses:


226

Cela s'appelle le chargement paresseux parce que, comme une personne paresseuse, vous retardez de faire quelque chose que vous ne voulez pas faire. Le contraire est Eager Loading, où vous chargez quelque chose tout de suite, bien avant d'en avoir besoin.

Si vous êtes curieux de savoir pourquoi les gens pourraient utiliser le chargement différé, envisagez une application qui prend un LOOOOONG de temps pour démarrer. Cette application est probablement en train d'effectuer beaucoup de chargement impatient ... de charger des choses à partir du disque, de faire des calculs et autres bien avant que cela ne soit jamais nécessaire.

Comparez cela au chargement paresseux, l'application démarrerait beaucoup plus rapidement, mais la première fois que vous devez faire quelque chose qui nécessite une charge longue, il peut y avoir une légère pause pendant son chargement pour la première fois. Ainsi, avec le chargement paresseux, vous amortissez le temps de chargement tout au long de l'exécution de votre application ... et vous pouvez en fait éviter de charger des choses que l'utilisateur n'a peut-être jamais l'intention d'utiliser.


@Mike Stone, Salut, pouvez-vous expliquer quand utiliser le chargement paresseux et impatient? Comme je le sais, si j'exécute le gestionnaire de fichiers, il utilise la conception de chargement paresseux.
Alston

40

Le Lazy Loading est une pratique de programmation dans laquelle vous ne chargez ou initialisez un objet que lorsque vous en avez besoin pour la première fois. Cela peut potentiellement vous donner une grande amélioration des performances, surtout si vous avez beaucoup de composants dans votre application.

Comme d'habitude, Wikipedia a plus de détails.


14

Le chargement paresseux est un concept dans lequel nous retardons le chargement de l'unité objet au point où nous en avons besoin. Mettre en mots simples le chargement d'objets à la demande plutôt que de charger les objets inutilement. Par exemple, si vous avez une classe "Client" qui a un objet "Commandes" agrégé. Vous aimez donc charger les données client mais les objets de commandes que vous souhaitez retarder jusqu'à ce que votre application en ait besoin.

Vous trouverez ci-dessous une vidéo youtube qui montre comment utiliser le chargement paresseux, comment nous pouvons mettre en œuvre le chargement paresseux et ses avantages et inconvénients.

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



7

Le terme chargement différé est généralement utilisé pour parler de mappeurs relationnels d'objets. Si vous utilisez ADO.NET directement, vous obtenez toujours un chargement impatient (c'est-à-dire qu'il charge toujours exactement ce que vous spécifiez).

Les mappeurs OR comme nHibernate prennent en charge le retour des objets proxy qui sont "remplis" avec les bonnes données uniquement lorsque vous accédez aux données. De cette façon, vous ne chargez que les données que vous utilisez réellement. C'est une fonctionnalité utile lorsque vous spécifiez un grand nombre de relations entre des objets qui peuvent être chargés à partir de la base de données, vous ne voulez pas que le mappeur OR charge tous les objets liés et les objets liés aux objets associés, etc. Cela peut entraîner le chargement de toute votre base de données.

Ce problème peut également être évité par une conception soignée de votre modèle d'objet. (l'utilisation d'agrégats et de ne charger que les racines d'agrégats comme dans la conception pilotée par domaine est un moyen de contourner ce problème sans utiliser le chargement paresseux).

Le chargement différé peut amener le mappeur ou à effectuer de nombreux petits accès à la base de données au lieu de récupérer toutes les données dont vous avez besoin une fois. Cela peut également entraîner des problèmes de performances.


5

Voici un exemple de code Python que j'ai écrit:

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

En gros, j'ai une classe Item qui représente un article dans notre inventaire. Le nombre total d'articles que nous avons est le nombre que nous possédons plus la somme de tous les articles que nous empruntons à diverses sources. Ces chiffres sont tous stockés dans notre base de données, et il serait inutile de calculer cela jusqu'à ce que le total soit réellement demandé (car souvent les articles seront utilisés sans que le total ne soit demandé).

Ainsi, la propriété total vérifie si le champ _total existe. Si ce n'est pas le cas, le code de propriété interroge la base de données et la calcule, puis stocke la valeur dans le champ _total afin qu'elle ne doive pas être recalculée la prochaine fois qu'elle est demandée.


4

Chargement paresseux: vous ne perdez pas votre temps (ni votre mémoire) avec des choses dont vous pourriez ne pas avoir besoin. Ensuite, lorsque vous en avez besoin, cela prend plus de temps, mais c'est très bien.

Exemple de la vie: au lieu d'apprendre réellement ce guide de conversation en français, vous apprenez les phrases une à la fois, selon vos besoins. Quand cela a-t-il un sens? Si vous ne serez en France que pour une courte période (c'est-à-dire que vous n'aurez pas besoin de beaucoup de phrases) ou si vous devez partir très bientôt. Si vous êtes là pour deux ans et / ou que vous avez beaucoup de temps pour étudier, alors il pourrait être beaucoup plus efficace d'apprendre tout le guide de conversation à l'avance (chargement impatient).

[Inspiré par l' Atome tel qu'enseigné en termes de gangs par Venus sur WKRP .]


Il n'est pas toujours normal que les choses prennent plus de temps. J'ai constaté que lorsqu'il n'est pas mis en œuvre de la manière la plus optimale, le chargement différé peut en fait ralentir considérablement une application.
Captain Sensible

1
@SeventhElement Je ne dis pas que c'est bien. C'est la base pour comprendre le chargement paresseux. Dans un cas où cela ne va pas (parce que, par exemple, l'interface utilisateur devient lente ou pour toute autre raison), vous pouvez opter pour un chargement hâtif.
Dan Rosenstark

4

Le chargement différé est un terme fréquemment utilisé dans les bases de données pour désigner le concept de chargement de parties des informations requises uniquement lorsque cela est nécessaire.

Je suppose que vous devez avoir un enregistrement qui a une jointure de plusieurs tables. Si vous avez tout récupéré en même temps, cela prendrait plus de temps que si vous alliez chercher, disons seulement la table principale. En utilisant le chargement différé, le reste des informations ne sera récupéré que s'il est nécessaire. Il s'agit donc en fait d'un «chargement efficace» dans certains scénarios.

Les autres types de `` chargement '' sont:

  1. Eager Loading - Chargement de toutes les tables connectées à la fois.

3

est un modèle de conception.

Chargement différé: jusqu'à ce que votre code nécessite une opération effectuée par un objet particulier, l'objet n'est pas initialisé et, une fois initialisé, il ne réinitialise pas l'objet mais utilise l'objet précédemment initialisé.

Cela rend votre code beaucoup plus efficace et aide à gérer l'utilisation de la mémoire.

Exemples d'applications de chargement paresseux:

Détenteur de la valeur d'initialisation Ghost Lazy


3

Certains des avantages du chargement paresseux:

  1. Minimise le temps de démarrage de l'application.
  2. L'application consomme moins de mémoire en raison du chargement à la demande.
  3. Les demandes inutiles au serveur sont évitées.

2

Un exemple de chargement différé serait une grille ou un tableau avec beaucoup de données sur une page Web pour afficher où l'application ne charge que la taille du point de vue du navigateur des utilisateurs à ce moment-là. Lorsqu'ils défilent vers le bas pour afficher plus de contenu ou de données, plus de données sont chargées à ce moment-là.

Cela devient de plus en plus un modèle de conception visuel / d'interaction commun via ajax ou jQuery.

Et comme mentionné ci-dessus, l'opposé serait Eager Loading où vous ne prenez pas en compte le client, ce qui pourrait avoir un impact négatif sur les performances.



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.