Cos'è il caricamento lento?


91

Cos'è il caricamento lento?

[Modifica dopo aver letto alcune risposte] Perché le persone usano questo termine così spesso?

Supponiamo che tu usi un recordset ASP / ADO e lo carichi con i dati o l'origine dati ADO.NET per un gridview.

Immagino che avrei dovuto chiedere perché le persone usano il termine Lazy Loading, quali sono gli "altri" tipi?

Risposte:


226

Si chiama caricamento lento perché, come una persona pigra, stai rimandando a fare qualcosa che non vuoi. L'opposto è il caricamento desideroso, in cui carichi qualcosa subito, molto prima che tu ne abbia bisogno.

Se sei curioso del motivo per cui le persone potrebbero utilizzare il caricamento lento, considera un'applicazione che impiega LOOOOONG tempo per avviarsi. Questa applicazione sta probabilmente facendo un caricamento impaziente ... caricando cose dal disco e facendo calcoli e quant'altro non molto prima che sia mai necessario.

Confronta questo con il caricamento lento, l'applicazione si avvia molto più velocemente, ma la prima volta che devi fare qualcosa che richiede un carico di lunga durata, potrebbe esserci una leggera pausa mentre viene caricata per la prima volta. Pertanto, con il caricamento lento, stai ammortizzando il tempo di caricamento durante l'esecuzione dell'applicazione ... e potresti effettivamente risparmiare dal caricamento di cose che l'utente potrebbe non voler mai utilizzare.


@ Mike Stone, ciao, puoi spiegare quando utilizzare il caricamento pigro e desideroso? Come so, se eseguo il file manager, utilizza il design del caricamento lento.
Alston

40

Lazy Loading è una pratica di programmazione in cui carichi o inizializzi un oggetto solo quando ne hai bisogno per la prima volta. Questo può potenzialmente darti un grande aumento delle prestazioni, specialmente se hai molti componenti nella tua applicazione.

Come al solito, Wikipedia ha più dettagli.


14

Il caricamento lento è un concetto in cui ritardiamo il caricamento dell'unità dell'oggetto nel punto in cui ne abbiamo bisogno. Inserendo parole semplici su richiesta, il caricamento degli oggetti invece di caricare gli oggetti inutilmente. Ad esempio, se hai una classe "Cliente" che ha un oggetto "Ordini" aggregato. Quindi ti piace caricare i dati del cliente ma gli oggetti degli ordini che desideri ritardare fino a quando la tua applicazione non ne ha bisogno.

Di seguito è riportato un video di YouTube che dimostra come utilizzare il caricamento lento, come possiamo implementare il caricamento lento e vantaggi e svantaggi dello stesso.

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



7

Il termine caricamento lento viene solitamente utilizzato quando si parla di mappatori relazionali di oggetti. Se usi ADO.NET direttamente ottieni sempre un caricamento desideroso (cioè carica sempre solo quello che specifichi).

I mappatori OR come nHibernate supportano la restituzione di oggetti proxy che vengono "riempiti" con i dati corretti solo quando si accede ai dati. In questo modo carichi solo i dati che usi veramente. Questa è una funzionalità utile quando si specificano molte relazioni tra oggetti che possono essere caricati dal database, non si desidera che il mappatore OR carichi tutti gli oggetti correlati e gli oggetti correlati agli oggetti correlati e così via. Ciò può comportare il caricamento dell'intero database.

Questo problema può essere evitato anche con un'attenta progettazione del modello a oggetti. (Usare aggregati e caricare solo root aggregati come nella progettazione guidata dal dominio è un modo per aggirare questo problema senza utilizzare il caricamento lento).

Il caricamento lento può far sì che il mapper o esegua molti piccoli accessi al database invece di recuperare tutti i dati necessari una volta. Ciò può causare anche problemi di prestazioni.


5

Ecco un esempio tratto da un codice Python effettivo che ho scritto:

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

Fondamentalmente, ho una classe Item che rappresenta un articolo nel nostro inventario. Il numero totale di elementi che abbiamo è il numero che possediamo più la somma di tutti gli elementi che stiamo prendendo in prestito da varie fonti. Questi numeri sono tutti memorizzati nel nostro database, e sarebbe inutile calcolarlo fino a quando non verrà effettivamente richiesto il totale (poiché spesso gli Articoli verranno utilizzati senza che venga richiesto il totale).

Quindi la proprietà total controlla se il campo _total esiste. In caso contrario, il codice della proprietà interroga il database e lo calcola, quindi memorizza il valore nel campo _total in modo che non sia necessario ricalcolarlo alla successiva richiesta.


4

Caricamento lento: non sprechi il tuo tempo (né la tua memoria) con cose di cui potresti non aver bisogno. Quindi quando ne hai bisogno, ci vuole più tempo, ma va bene.

Esempio dal vero: invece di imparare effettivamente quel frasario francese, impari le frasi una alla volta, quando sono necessarie. Quando ha senso? Se rimarrai in Francia solo per un breve periodo (cioè non avrai bisogno di molte frasi) o se dovrai partire molto presto. Se sei lì da due anni e / o hai molto tempo per studiare, allora potrebbe essere molto più efficiente imparare semplicemente l'intero frasario in anticipo (caricamento desideroso).

[Ispirato dall'Atomo come insegnato in termini di gang da Venus su WKRP .]


Non è sempre giusto che le cose richiedano più tempo. Ho riscontrato che, se non implementato nel modo più ottimale, il caricamento lento può effettivamente rallentare un'applicazione in modo significativo.
Captain Sensible

1
@SeventhElement Non sto sostenendo che va bene. È la base per comprendere il caricamento lento. In un caso in cui non va bene (perché, ad esempio, l'interfaccia utente diventa lenta o per qualsiasi altro motivo) puoi optare per il caricamento desideroso.
Dan Rosenstark

4

Il caricamento lento è un termine usato frequentemente nei database per fare riferimento al concetto di caricamento di parti delle informazioni richieste solo quando è necessario.

Supponiamo che tu abbia bisogno di un record che abbia un join di più tabelle. Se avessi recuperato tutto in una volta, ci sarebbe voluto più tempo rispetto a se avessi recuperato solo la tabella principale. Utilizzando il caricamento lento, il resto delle informazioni verrà recuperato solo se necessario. Quindi è in realtà un "caricamento efficiente" in determinati scenari.

Gli altri tipi di "caricamento" sono:

  1. Caricamento desideroso: caricamento di tutte le tabelle collegate contemporaneamente.

3

è un modello di design.

Caricamento lento: fino a quando il codice non richiede un'operazione eseguita da un particolare oggetto, l'oggetto non viene inizializzato e una volta inizializzato non reinizializza l'oggetto ma utilizza l'oggetto precedentemente inizializzato.

Ciò rende il codice molto più efficiente e aiuta a gestire l'utilizzo della memoria.

Esempi di applicazioni del caricamento lento:

Inizializzazione Ghost Lazy Possessore del valore


3

Alcuni dei vantaggi del caricamento lento:

  1. Riduce al minimo il tempo di avvio dell'applicazione.
  2. L'applicazione consuma meno memoria a causa del caricamento su richiesta.
  3. Si evitano richieste non necessarie al server.

2

Un esempio di Lazy Loading potrebbe essere una griglia o una tabella con molti dati su una pagina Web per visualizzare dove l'applicazione carica solo la dimensione del punto di vista del browser dell'utente in quel momento. Quando scorrono verso il basso per visualizzare più contenuti o dati, in quel momento verranno caricati più dati.

Questo sta diventando sempre più un modello di progettazione visiva / interazione comune anche tramite ajax o jQuery.

E come accennato in precedenza, l'opposto sarebbe il caricamento desideroso in cui non si prende in considerazione il client, quindi potenzialmente con un calo delle prestazioni.



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.