Gestione memoria R / non può allocare vettore di dimensione n Mb

Sto riscontrando problemi nel tentativo di utilizzare oggetti di grandi dimensioni in R. Ad esempio:

> memory.limit(4000) > a = matrix(NA, 1500000, 60) > a = matrix(NA, 2500000, 60) > a = matrix(NA, 3500000, 60) Error: cannot allocate vector of size 801.1 Mb > a = matrix(NA, 2500000, 60) Error: cannot allocate vector of size 572.2 Mb # Can't go smaller anymore > rm(list=ls(all=TRUE)) > a = matrix(NA, 3500000, 60) # Now it works > b = matrix(NA, 3500000, 60) Error: cannot allocate vector of size 801.1 Mb # But that is all there is room for 

Capisco che questo è legato alla difficoltà di ottenere blocchi contigui di memoria (da qui ):

I messaggi di errore che iniziano non possono allocare il vettore di dimensione indicano un errore nell’ottenere la memoria, sia perché le dimensioni superano il limite di spazio degli indirizzi per un processo o, più probabilmente, perché il sistema non è stato in grado di fornire la memoria. Si noti che su una build a 32 bit ci potrebbe essere abbastanza memoria libera disponibile, ma non un blocco contiguo abbastanza grande di spazio indirizzo in cui mapparlo.

Come posso aggirare questo? La mia difficoltà principale è che riesco ad arrivare a un certo punto del mio script e R non può allocare 200-300 Mb per un object … Non posso davvero pre-allocare il blocco perché ho bisogno della memoria per altre elaborazioni. Ciò accade anche quando rimuovo dilligentemente gli oggetti non necessari.

EDIT: Sì, mi dispiace: Windows XP SP3, 4 GB di RAM, R 2.12.0:

 > sessionInfo() R version 2.12.0 (2010-10-15) Platform: i386-pc-mingw32/i386 (32-bit) locale: [1] LC_COLLATE=English_Caribbean.1252 LC_CTYPE=English_Caribbean.1252 [3] LC_MONETARY=English_Caribbean.1252 LC_NUMERIC=C [5] LC_TIME=English_Caribbean.1252 attached base packages: [1] stats graphics grDevices utils datasets methods base 

Considera se hai davvero bisogno di tutti questi dati esplicitamente o la matrice può essere scarsa? C’è un buon supporto in R (vedi pacchetto Matrix per esempio) per matrici sparse.

Mantenere tutti gli altri processi e oggetti in R al minimo quando è necessario creare oggetti di queste dimensioni. Usa gc() per cancellare la memoria ora non utilizzata, o, meglio solo creare l’object che ti serve in una sessione .

Se quanto sopra non può essere d’aiuto, procurati una macchina a 64-bit con la quantità di RAM che puoi, e installa 64-bit R.

Se non ci riesci, ci sono molti servizi online per l’elaborazione remota.

Se non puoi farlo, gli strumenti di mapping della memoria come il pacchetto ff (o bigmemory come menziona Sascha) ti aiuteranno a build una nuova soluzione. Nella mia esperienza limitata ff è il pacchetto più avanzato, ma dovresti leggere l’argomento High Performance Computing nelle visualizzazioni attività CRAN.

Per gli utenti Windows, quanto segue mi ha aiutato molto a capire alcune limitazioni di memoria:

  • prima di aprire R, apri Windows Resource Monitor (Ctrl-Alt-Canc / Start Task Manager / Performance tab / fai clic sul pulsante in basso ‘Resource Monitor’ / Memory tab)
  • vedrai quanta memoria RAM usiamo già prima di aprire R e da quali applicazioni. Nel mio caso, vengono utilizzati 1,6 GB dei 4 GB totali. Quindi sarò in grado di ottenere solo 2,4 GB per R, ma ora viene il peggio …
  • aprire R e creare un set di dati di 1,5 GB, quindi ridurne le dimensioni a 0,5 GB, il monitor risorse mostra che la mia RAM viene utilizzata quasi al 95%.
  • usa gc() per fare garbage collection => funziona, posso vedere l’uso della memoria scendere a 2 GB

inserisci la descrizione dell'immagine qui

Ulteriori consigli che funzionano sulla mia macchina:

  • preparare le funzioni, salvare come file RData, chiudere R, riaprire R e caricare le caratteristiche del treno. Generalmente il Resource Manager mostra un utilizzo inferiore della memoria, il che significa che anche gc () non recupera tutta la memoria ansible e la chiusura / riapertura R funziona meglio per iniziare con la memoria massima disponibile .
  • l’altro trucco è di caricare solo il treno impostato per l’allenamento (non caricare il set di prova, che in genere può essere metà delle dimensioni del set di treni). La fase di allenamento può utilizzare la memoria al massimo (100%), quindi tutto ciò che è disponibile è utile. Tutto questo è da prendere con un pizzico di sale mentre sto sperimentando i limiti della memoria R.

Ecco una presentazione su questo argomento che potresti trovare interessante:

http://www.bytemining.com/2010/08/taking-r-to-the-limit-part-ii-large-datasets-in-r/

Non ho provato personalmente le cose discusse, ma il pacchetto bigmemory sembra molto utile

Il modo più semplice per aggirare questa limitazione è passare a 64 bit R.

Ho riscontrato un problema simile e ho utilizzato 2 unità flash come “ReadyBoost”. Le due unità hanno fornito ulteriori 8 GB di memoria (per la cache), risolvendo il problema e aumentando la velocità del sistema nel suo complesso. Per utilizzare Readyboost, fare clic con il tasto destro del mouse sull’unità, selezionare Proprietà e selezionare “ProntoBoost” e selezionare il pulsante di opzione “utilizza questo dispositivo” e fare clic su Applica o su OK per configurare.

Se stai eseguendo il tuo script in ambiente Linux puoi usare questo comando:

 bsub -q server_name -R "rusage[mem=requested_memory]" "Rscript script_name.R" 

e il server assegnerà la memoria richiesta per te (in base ai limiti del server, ma con un buon server – possono essere utilizzati file enormi)

Il metodo di salvataggio / caricamento sopra menzionato funziona per me. Non sono sicuro di come / if gc() deframmenta la memoria ma questo sembra funzionare.

 # defrag memory save.image(file="temp.RData") rm(list=ls()) load(file="temp.RData")