2009-07-23 2 views
24

Dopo la creazione di oggetti di grandi dimensioni e rimanere a corto di RAM, cercherò di eliminare gli oggetti nel mio ambiente corrente utilizzandodell'utilizzo della memoria in R

rm(list=ls()) 

Quando controllo il mio utilizzo di RAM, non è cambiato nulla. Anche dopo aver chiamato gc() non è cambiato nulla. Posso solo riempire la mia RAM abbandonando R.

Qualcuno ha consigli per occuparsi di oggetti con memoria elevata all'interno di R?

risposta

19

La memoria per gli oggetti eliminati non viene rilasciata immediatamente. R usa una tecnica chiamata "garbage collection" per recuperare la memoria per gli oggetti cancellati. Periodicamente passa in rassegna l'elenco degli oggetti accessibili (in pratica quelli che hanno nomi e non sono stati cancellati e quindi accessibili dall'utente) e li "taggano" per la conservazione. La memoria di tutti gli oggetti senza tag viene restituita al sistema operativo dopo lo spazzamento della garbage collection.

La raccolta dei dati inutili avviene automaticamente e non si ha alcun controllo diretto su questo processo. Ma puoi forzare una sweep chiamando il comando gc() dalla riga di comando.

Anche in questo caso, in alcuni sistemi operativi la garbage collection potrebbe non recuperare memoria (come riportato dal sistema operativo). Le versioni precedenti di Windows, ad esempio, potrebbero aumentare ma non ridurre l'ingombro della memoria di R. Garbage Collection non farebbe spazio solo per nuovi oggetti in futuro, ma non ridurrebbe l'uso della memoria di R.

3

La mia impressione è che siano state provate più forme di gc() prima che i rapporti R non riuscissero ad allocare la memoria. Al momento non sono a conoscenza di una soluzione, tranne il riavvio di R come suggerisci. Sembra che R non deframmenta la memoria.

8

Su Windows, la tecnica che descrivi funziona per me. Prova il seguente esempio.

Aprire il Task Manager di Windows (CTRL + MAIUSC + ESC).

Start RGui. L'utilizzo di RGui.exe è 27 460K.

Tipo

gcinfo(TRUE) 
x <- rnorm(1e8) 

RGui.exe Utilizzo memoria è ora 811 100K.

Tipo rm("x"). L'utilizzo di RGui.exe è ancora 811 100K.

Tipo gc(). L'utilizzo di RGui.exe è ora di 28 332K.

Nota che gc shoud può essere chiamato automaticamente se hai rimosso oggetti dal tuo spazio di lavoro, e quindi provi ad allocare più memoria a nuove variabili.

+0

Ecco come si comporta dalla mia parte. Sto usando R 2.8.1 su Windows XP. – ars