Cancella memoria in R

Gustavo du Mortier 22 giugno 2021
Cancella memoria in R

Dopo aver lavorato con gli script R per un po’ , l’ambiente R potrebbe accumulare molti dati in memoria, trattenendo parti significative delle risorse del computer. Questa situazione potrebbe finire con il sistema R che rifiuta di eseguire il codice perché non può allocare altra memoria. Anche se riavvii il tuo ambiente R, può succedere che la memoria non venga liberata.

Ci si aspetta che il comando rm(list=ls()) rilasci la memoria usata da tutti gli oggetti, ma quello che fa veramente è distruggere i puntatori ai blocchi di memoria usati. Il problema è che quei blocchi di memoria non vengono immediatamente liberati per essere utilizzati da nuove attività.

Cancella memoria in R Con la funzione gc

Il processo di garbage collection viene eseguito automaticamente e periodicamente all’interno di R, ma a volte non viene eseguito nel momento preciso in cui è necessaria molta memoria per alcune operazioni sui big data. In una situazione del genere, potrebbe essere utile chiamare la funzione gc() per cancellare la memoria in R.

Lo scopo principale di gc() è mostrare un rapporto sull’utilizzo della memoria. Come effetto collaterale, chiamare gc() innesca il processo di garbage collection, cancellando la memoria. Pertanto, come nota la documentazione gc, è una buona idea chiamare gc() dopo che un oggetto di grandi dimensioni è stato rimosso poiché questa azione richiede a R di rilasciare la memoria che non usa più.

Puoi anche inserire una chiamata a gc() all’interno di un bucle per eseguire ripetutamente il processo di garbage collection. Tieni presente che questo processo richiede un po’ di tempo nell’ordine di 100 ms per chiamata, quindi non è consigliabile inserirlo in un loop altamente ripetitivo o in un loop con un numero elevato di iterazioni.

Se usi Windows, puoi chiamare la funzione memory.size() con il parametro max=T per mostrare la quantità di memoria accessibile dal sistema operativo, o con max=F per mostrare quanta memoriaè essere utilizzato in qualsiasi momento. La documentazione R spiega altri aspetti della funzione memory.size().

Per mostrare come varia il consumo di memoria quando crei e distruggi oggetti Big Data, possiamo eseguire il seguente codice in Windows che crea un vettore di esempio con 100.000 elementi, rimuove il vettore e infine esegue una garbage collection. Tra ogni istruzione, possiamo controllare quanta memoria viene utilizzata eseguendo la funzione memory.size con il parametro max=F.

memory.size (max = F)

Produzione:

[1] 32.6

Questi 32,6 MB rappresentano la quantità minima di memoria utilizzata da R.

my_data <- sample (1:100000)
memory.size (max = F)

Produzione:

[1] 33.75

Possiamo vedere che i dati campione creati consumano circa 1 MB di memoria poiché la memoria utilizzata segnalata dalla funzione memory.size è aumentata di 1.

rm (my_data)
memory.size (max = F)

Produzione:

[1] 33.75

Anche se abbiamo rimosso l’oggetto, la memoria sembra essere ancora occupata.

gc()

Produzione:

         used (Mb) gc trigger  (Mb)  max used  (Mb)
Ncells 315785 16.9     617200  33.0    617200  33.0
Vcells 633077  4.9   25730861 196.4 110503932 843.1
memory.size (max = F)

Produzione:

[1] 32.6

La quantità di memoria sarà diversa per ogni computer, ma puoi vedere che la quantità di memoria libera riportata da memory.size rimane la stessa dopo aver eseguito l’istruzione rm (my_data) e che ritorna solo al valore iniziale di 32,6 MB dopo che l’istruzione gc() è stata eseguita e la memoria è stata effettivamente liberata.