2013-04-05 16 views
11

ho 6 GB di memoria nella mia macchina (Windows 7 Pro 64 bit) e R, ottengogestione efficiente della memoria in R

> memory.limit() 
6141 

Naturalmente, quando si tratta di dati di grandi dimensioni, si verifica un errore di allocazione della memoria. Quindi, al fine di rendere R per utilizzare la memoria virtuale, io uso

> memory.limit(50000) 

Ora, quando si esegue il mio script, non ho errore di allocazione di memoria più, ma R maiali tutta la memoria nel mio computer in modo da poter usare la macchina fino al termine dello script Mi chiedo se c'è un modo migliore per far sì che R gestisca la memoria della macchina. Penso che qualcosa che può fare è usare la memoria virtuale se sta usando la memoria fisica più di quella specificata dall'utente. C'è qualche opzione come quella?

risposta

9

Guardate la FF e pacchetti bigmemory. Questo utilizza funzioni che conoscono gli oggetti R per tenerli su disco piuttosto che lasciare che il sistema operativo (che conosce solo pezzi di memoria, ma non ciò che rappresentano).

5

R non gestisce la memoria della macchina. Questa è la responsabilità del sistema operativo. L'unica ragione per memory.size e memory.limit esiste in Windows è perché (da help("Memory-limits")):

Under Windows, R imposes limits on the total memory allocation 
available to a single session as the OS provides no way to do so: 
see 'memory.size' and 'memory.limit'. 

R oggetti anche di occupare spazio contiguo di RAM, in modo da poter incorrere in problemi di allocazione di memoria con pochi oggetti di grandi dimensioni. Probabilmente potresti stare più attento con il numero/dimensione degli oggetti che crei ed evitare di usare così tanta memoria.

+0

Oppure investire in più RAM. – Roland

3

Questa non è una soluzione ma un suggerimento. Utilizza oggetti con memoria efficiente laddove possibile: ad esempio, usa una matrice invece di un data.frame.

Ecco un esempio

m = matrix(rnorm(1000), 2, 2) 
d = as.data.frame(m) 
object.size(m) 
232 bytes 
object.size(d) 
808 bytes 
+3

Questo esempio sembra evidenziare solo la differenza di allocazione dei dati fissa molto piccola. Prendi la matrice per essere 'm = matrice (rnorm (1000), 20000, 10)' e le differenze di dimensioni tra gli oggetti diventano trascurabili. In effetti, controllando ciò per un po 'casuale 'data.frame' che avevo nel mio spazio di lavoro, la versione' matrix' era 2 volte più grande. Quindi non penso che questo suggerimento sia utile per il problema in questione. – eddi

+1

No. Non sono d'accordo. Le matrici sono più efficienti di data.frame. Questo è uno dei motivi per cui internamente molte funzioni R costringono alle matrici i dati che si trovano nei frame di dati. Dico chiaramente che la mia risposta è solo un suggerimento una buona pratica se vuoi. Per il tuo secondo commento (casuale data.frame più piccolo della versione matrix) penso che sia False. – agstudy

+0

Questo è quello che vedo per uno specifico 'data.frame' che ho nel mio spazio di lavoro. 'object.size (as.data.frame (rec)): 11542192 byte e' object.size (as.matrix (rec)): 26516160 byte. – eddi