R gestione della memoria / impossibile allocare vettore di dimensioni n Mb


149

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 di memoria contigui (da qui ):

L'inizio dei messaggi di errore non può allocare un vettore di dimensione indica un errore nell'ottenere memoria, perché la dimensione ha superato il limite di spazio indirizzo 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 potrebbe essere disponibile memoria sufficiente, ma non un blocco contiguo abbastanza grande di spazio di indirizzi in cui mapparlo.

Come posso aggirare questo? La mia difficoltà principale è che arrivo a un certo punto nel mio script e R non può allocare 200-300 Mb per un oggetto ... Non riesco davvero a pre-allocare il blocco perché ho bisogno della memoria per altre elaborazioni. Questo succede anche quando rimuovo con durezza gli oggetti non necessari.

EDIT: Sì, scusa: Windows XP SP3, 4Gb 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

Prova a usare 'free' per desallocare la memoria di altri processi non utilizzati.
Manoel Galdino,

5
@ Manoel Galdino: che cos'è "gratuito"? Una funzione R?
Benjamin

3
@Manoel: in R, l'attività di liberare memoria è gestita dal Garbage Collector, non dall'utente. Se si lavora a livello C, si può manualmente Calloce Freememoria, ma sospetto che questo non sia ciò che Benjamin sta facendo.
Sharpie

Nella libreria XML puoi usare gratuitamente. Dalla documentazione: "Questa funzione generica è disponibile per il rilascio esplicito della memoria associata all'oggetto dato. È destinata all'uso su oggetti puntatore esterni che non dispongono di una funzione / routine di finalizzatore automatico che pulisce la memoria utilizzata dal oggetto nativo ".
Manoel Galdino,

Risposte:


78

Considera se hai davvero bisogno di tutti questi dati esplicitamente o la matrice può essere sparsa? C'è un buon supporto in R (vedi Matrixpacchetto per es.) Per matrici sparse.

Mantenere tutti gli altri processi e oggetti in R al minimo quando è necessario creare oggetti di queste dimensioni. Utilizzare gc()per cancellare la memoria ora inutilizzata o, meglio, creare solo l'oggetto necessario in una sessione .

Se quanto sopra non può essere d'aiuto, procurati un computer a 64 bit con la quantità di RAM che puoi permetterti e installa 64 bit R.

Se non puoi farlo, ci sono molti servizi online per il calcolo remoto.

Se non riesci a farlo, gli strumenti di mappatura della memoria come pacchetto ff(o bigmemorycome menziona Sascha) ti aiuteranno a costruire una nuova soluzione. Nella mia esperienza limitata ffè il pacchetto più avanzato, ma dovresti leggere l' High Performance Computingargomento su CRAN Task Views.


1
l'attività è la classificazione delle immagini, con randomForest. Ho bisogno di avere una matrice di dati di allenamento (fino a 60 bande) e ovunque da 20.000 a 6.000.000 di righe per alimentare la foresta casuale. Attualmente, raggiungo il massimo a circa 150.000 righe perché ho bisogno di un blocco contiguo per contenere l'oggetto randomForest risultante ... Ecco perché bigmemory non aiuta, poiché randomForest richiede un oggetto matrice.
Benjamin

Cosa intendi con "crea l'oggetto di cui hai bisogno in una sessione"?
Benjamin

crea 'una' solo una volta, se sbagli la prima volta inizia una nuova sessione
mdsumner

1
Aggiungo che per i programmi che contengono loop di grandi dimensioni in cui viene eseguito un sacco di calcolo ma l'output è relativamente piccolo, può essere più efficiente in termini di memoria chiamare la parte interna del ciclo tramite Rscript (da un BASH o Python Script) e successivamente raggruppare / aggregare i risultati in uno script diverso. In questo modo, la memoria viene completamente liberata dopo ogni iterazione. C'è un po 'di spreco di calcolo dal ricaricare / ri-calcolare le variabili passate al ciclo, ma almeno puoi aggirare il problema di memoria.
Benjamin

54

Per gli utenti Windows, ciò che segue mi ha aiutato molto a comprendere alcune limitazioni di memoria:

  • prima di aprire R, aprire Monitor risorse di Windows (Ctrl-Alt-Canc / Avvia Task Manager / scheda Prestazioni / fare clic sul pulsante inferiore 'Monitor risorse' / scheda Memoria)
  • vedrai quanta memoria RAM abbiamo già usato prima di aprire R e da quali applicazioni. Nel mio caso, vengono utilizzati 1,6 GB del totale di 4 GB. Quindi sarò solo in grado di ottenere 2,4 GB per R, ma ora arriva il peggio ...
  • apri R e crea un set di dati di 1,5 GB, quindi riduci le sue dimensioni a 0,5 GB, Resource Monitor mostra che la mia RAM viene utilizzata a quasi il 95%.
  • usa gc()per fare garbage collection => funziona, posso vedere l'uso della memoria scendere a 2 GB

inserisci qui la descrizione dell'immagine

Ulteriori consigli che funzionano sulla mia macchina:

  • preparare le funzioni, salvare come file RData, chiudere R, riaprire R e caricare le funzioni del treno. Il Resource Manager mostra in genere un utilizzo della memoria inferiore, il che significa che anche gc () non recupera tutta la memoria possibile e la chiusura / riapertura di R funziona meglio per iniziare con la massima memoria disponibile .
  • l'altro trucco consiste nel caricare solo il set di treni per l'allenamento (non caricare il set di test, che in genere può avere la 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 granello di sale mentre sto sperimentando limiti di memoria R.

9
R fa la raccolta dei rifiuti da sola, gc()è solo un'illusione. Controllare Task Manager è un'operazione Windows molto semplice. L'unico consiglio che posso concordare è il salvataggio in formato .RData
David Arenburg,

3
@DavidArenburg gc () è un'illusione? Ciò significherebbe che l'immagine che ho sopra mostra la caduta dell'uso della memoria è un'illusione. Penso che ti sbagli, ma potrei sbagliarmi.
Timothée HENRY,

4
Non intendevo dire che gc()non funziona. Intendo solo che R lo fa automaticamente, quindi non è necessario farlo manualmente. Vedi qui
David Arenburg,

2
@DavidArenburg Posso dirti per certo che la caduta dell'utilizzo della memoria nella foto sopra è dovuta al comando gc (). Non credo che il documento che indichi sia corretto, almeno non per la mia configurazione (Windows, R versione 3.1.0 (2014-04-10) Piattaforma: i386-w64-mingw32 / i386 (32-bit)).
Timothée HENRY,

15
Ok, per l'ultima volta. gc() Funziona . Non devi semplicemente usarlo perché R lo fa internamente
David Arenburg,


14

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


25
Questa non è una cura in generale - ho cambiato, e ora Error: cannot allocate vector of size ... Gbinvece ho (ma sì, ho molti dati).
om-nom-nom,

2
Forse non è una cura ma aiuta molto. Basta caricare su RAM e continuare a girare memory.limit (). Oppure, forse pensa a partizionare / campionare i tuoi dati.
random_forest_fanatic

Se hai problemi anche a 64 bit, che è essenzialmente illimitato, è probabilmente più che stai cercando di allocare qualcosa di veramente massiccio. Hai calcolato quanto dovrebbe essere grande il vettore, teoricamente? Altrimenti, potrebbe essere che il tuo computer abbia bisogno di più RAM, ma c'è solo così tanto che puoi avere.
hangmanwa7id,

bello provare le soluzioni semplici come questa prima di altre soluzioni testa a muro. Grazie.
Nova

Inoltre, questo non è esclusivamente un problema con Windows. Attualmente sto usando Ubuntu, 64-bit R, usando Matrix e ho difficoltà a manipolare un oggetto Matrix 20048 x 96448.

12

Ho riscontrato un problema simile e ho usato 2 unità flash come "ReadyBoost". Le due unità hanno aumentato ulteriormente la memoria di 8 GB (per la cache), risolvendo il problema e aumentando anche la velocità del sistema nel suo complesso. Per utilizzare Readyboost, fare clic con il tasto destro sull'unità, andare su Proprietà e selezionare "ReadyBoost" e selezionare il pulsante di opzione "usa questo dispositivo" e fare clic su Applica o OK per configurare.


11

Ho seguito la pagina di aiuto di memor.limit e ho scoperto che sul mio computer R per impostazione predefinita può utilizzare fino a ~ 1,5 GB di RAM e che l'utente può aumentare questo limite. Utilizzando il seguente codice,

>memory.limit()
[1] 1535.875
> memory.limit(size=1800)

mi ha aiutato a risolvere il mio problema.


1
Perché questo viene annullato? certo, è un approccio pericoloso, ma spesso può essere d'aiuto se solo un po 'più di memoria deve essere allocata alla sessione perché funzioni.
Jeppe Olsen,

3
Questa è solo una soluzione specifica per Windows
Jinhua Wang

9

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 - è possibile utilizzare enormi file)


1
Posso usarlo su un'istanza di Amazon EC2? In tal caso, cosa devo mettere al posto di server_name? Mi sto imbattendo in questo cannot allocate vector size...con il tentativo di fare un enorme Document-Term Matrix su un AMI e non riesco a capire perché non ha memoria sufficiente o quanto altro ho bisogno di affittare. Grazie!
seth127,

Sono un principiante di Ubuntu e sto usando Rstudio. Ho 16 GB di RAM. Come posso applicare il processo che mostri nella risposta. Grazie
runjumpfly,

3

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

# defrag memory 
save.image(file="temp.RData")
rm(list=ls())
load(file="temp.RData")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.