Estendendo il concetto di Lazy Loading, allo scaricamento

0

Un sistema che a volte dovrà utilizzare un modello di apprendimento automatico preliminare. Quel modello è di circa 10 GB su disco, e quando caricato utilizza circa 10 GB di RAM.

Il caricamento da disco richiede una quantità di tempo non banale, quindi in generale vorrei non farlo troppo spesso. Certamente non tutte le funzioni chiamano contro di esso.

In questo momento, sto usando un modello Lazy Loading- (ish), dove la prima volta viene effettuata una chiamata di funzione contro di essa viene caricato quindi memorizzato in una variabile globale.

Questo è bello, perché fare alcune analisi del mio sistema non sarà mai necessario. Quindi caricarlo pigramente consente di risparmiare un paio di minuti su quelle piste.

Tuttavia, altre volte il mio sistema è in esecuzione come processo a esecuzione prolungata (esposto tramite un'API Web). In questi casi, non voglio usare fino a 10 GB di RAM tutto il tempo, potrebbero essere giorni (o settimane) tra le persone che utilizzano i metodi dell'API che si basano su quel modello, quindi potrebbero essere utilizzati 1000 volte nell'arco di 1 ora e quindi non essere utilizzati per giorni.

Ci sono altri programmi (e altri utenti) su questo sistema, quindi non voglio fare il hogging di tutte le risorse per questo programma, quando non vengono utilizzate.

Quindi la mia idea è che dopo un certo periodo di tempo, se nessuna chiamata API ha utilizzato il modello, il codice verrà attivato per lo scaricamento il modello (spazzatura che raccoglie la memoria),  lasciandolo di nuovo pigro-caricato la prossima volta che è necessario.

  • È un piano ragionevole?
  • È uno schema noto?
  • Forse non è necessario e dovrei semplicemente fidarmi del mio sistema operativo su SWAP che lo invia al disco.

Questo è legato a Esiste un nome per il controparte del modello di caricamento pigro? Tuttavia, questa domanda non è chiara se in realtà si stia solo chiedendo dei modelli di gestione della memoria in generale.

    
posta Lyndon White 15.02.2018 - 10:30
fonte

3 risposte

0

Non devi fare nulla.

Finché il tuo sistema ha sufficiente memoria virtuale (cioè file di paging, Swap), il sistema operativo sostituirà la memoria a cui non si ha accesso da molto tempo su disco.

In pratica stai descrivendo implementando questo manualmente, che su qualsiasi sistema normale non sarà richiesto.

(Questa risposta si espande sul commento di @Caleth)

    
risposta data 23.05.2018 - 11:50
fonte
5

Il normale approccio al caching è quello di mettere le cose nella cache quando ne hai bisogno e rimuoverle quando provi a inserire una nuova cosa nella cache, ma non hai abbastanza memoria per farlo.

Hai quindi una varietà di modi per specificare quali delle cose nella cache che vuoi rimuovere per prime. Più vecchi, meno usati, più grandi ecc.

Non dici quale lingua stai usando, ma sarei sorpreso se non ci fossero già alcune librerie di cache disponibili per l'uso.

    
risposta data 15.02.2018 - 11:36
fonte
3

Molti linguaggi raccolti con garbage hanno il concetto di WeakReference<T> , inclusi Java e .Net. Ciò consente al tuo codice che carica i dati di avere un riferimento che può essere raccolto. Finché qualcosa nel tuo codice ha un strong riferimento ai dati rimane in memoria.

Ciò consente un modo abbastanza flessibile di caricare i dati su richiesta, ma la normale pressione della memoria eliminerà le cose che non vengono più utilizzate.

Un tipico caso d'uso sarebbe qualcosa in questo senso:

Get the value from the reference

If the value is null,
    load the data
    set the reference

return the data

Il meccanismo esatto dipende dalla tua lingua. Ciò significa che non devi eseguire i tuoi meccanismi di raccolta dei rifiuti e consente di scaricare i dati per creare spazio per i nuovi dati.

Tuttavia, ci sono molte alternative da esplorare:

  • Schema del peso corporeo con pool di istanze
    • Consente un numero inferiore di riferimenti a oggetti in memoria poiché probabilmente si fa riferimento solo a una manciata di singoli record contemporaneamente
    • Ha senso quando la creazione di oggetti è costosa, ma l'impostazione dei dati su un oggetto esistente è veloce, il che può essere vero per qualsiasi oggetto quando ce ne sono abbastanza nella RAM in una volta.
  • Caching
  • Garbage collection manuale
risposta data 15.02.2018 - 19:36
fonte