2013-01-16 13 views
7

Sto eseguendo alcune simulazioni su una macchina con memoria da 16 GB. In primo luogo, ho incontrato alcuni errori:Problema di memoria R con memory.limit()

Error: cannot allocate vector of size 6000.1 Mb (the number might be not accurate) 

Poi ho cercato di allocare più memoria al R utilizzando:

memory.limit(1E10) 

La ragione della scelta di un numero così grande è perché memory.limit non mi può consentire di selezionare un numero minore di mio sistema di memoria totale

In memory.size(size) : cannot decrease memory limit: ignored 

Dopo aver fatto questo, posso terminare i miei simulazioni, ma R ha preso in giro la memoria 15 GB, che si è fermato il mio dal fare qualsiasi messaggio analy sis.

Ho utilizzato object.size() per stimare la memoria totale utilizzata di tutta la variabile generata, che ha richiesto solo circa 10 GB. Non riuscivo a capire dove R prendesse il resto del ricordo. Quindi la mia domanda è: come posso allocare ragionevolmente memoria a R senza far esplodere la mia macchina? Grazie!

+2

sei sicuro di aver guardato tutte le variabili esistenti? 'Ls (all = TRUE)' elenca solo quelli che hai generato? Si noti che anche se un oggetto viene eliminato, la memoria utilizzata per memorizzare quell'oggetto non è libera fino a quando non viene chiamato il garbage collector. R lo fa periodicamente, ma puoi forzare la raccolta con 'gc()'. –

+0

Non ho controllato l'utilizzo della memoria per tutta la mia memoria. Ma ho usato gc() nella mia simulazione dopo ogni iterazione ... –

+2

In generale, hai bisogno di circa 3 volte la quantità di memoria occupata dai tuoi oggetti. Questo a causa della copia di oggetti. –

risposta

2

R è interpretato in modo WYSINAWYG (quello che vedi non è sempre quello che ottieni). Come menzionato nei commenti, è necessaria più memoria necessaria per la memorizzazione degli oggetti a causa della copia di detti oggetti. Inoltre, è possibile che oltre a essere inefficienti, i loop nidificati di for siano una cattiva idea perché il gc non verrà eseguito nel ciclo più interno. Se hai qualcuno di questi ti suggerisco di provare a rimuoverli usando metodi vettorizzati, o chiama manualmente gc nei tuoi loop per forzare le raccolte di dati inutili, ma avverti che questo rallenterà un po '.

Il problema della memoria richiesta per il semplice gli oggetti possono essere illustrati dal seguente esempio. Questo codice genera un oggetto data.frame. Guarda l'uso della memoria prima, dopo e la dimensione dell'oggetto risultante. C'è un sacco di spazzatura che è permesso accumulare prima che venga invocato lo gc. Penso che la raccolta dei rifiuti sia problematica su Windows rispetto ai sistemi * nix. Non riesco a replicare l'esempio in basso su Mac OS X, ma posso ripetutamente su Windows. Il ciclo e ulteriori spiegazioni possono essere trovati in The R Inferno pagina 13 ...

# Current memory usage in Mb 
memory.size() 
# [1] 130.61 
n = 1000 

# Run loop overwriting current objects 
my.df <- data.frame(a=character(0), b=numeric(0)) 
for(i in 1:n) { 
this.N <- rpois(1, 10) 
my.df <- rbind(my.df, data.frame(a=sample(letters, 
this.N, replace=TRUE), b=runif(this.N))) 
} 
# Current memory usage afterwards (in Mb) 
memory.size() 
# [1] 136.34 

# BUT... Size of my.df 
print(object.size(my.df) , units = "Mb") 
0.1 Mb 
Problemi correlati