2012-07-19 10 views
17

Sto cercando di unire due dataframe: uno ha 908450 osservazioni di 33 variabili e l'altro ha 908450 osservazioni di 2 variabili.Superamento del limite di memoria in R (anche con 24 GB di RAM)

dataframe2 <-merge(dataframe1, dataframe2, by="id") 

ho cancellato tutti gli altri dataframes dalla memoria di lavoro, e ripristina il limite di memoria (per un nuovo desktop con 24 GB di RAM) utilizzando il codice:

memory.limit(24576) 

Ma, I' Sto ancora ricevendo l'errore Cannot allocate vector of size 173.Mb.

Qualche idea su come aggirare questo problema?

+4

pacchetto 'data.table' può essere più efficiente della memoria e molto molto più veloce di' data.frames' dal momento che rende meno copie di dati. – Chase

+2

Stai effettivamente utilizzando il 24 Gb, e relativo, è il tuo os 64 bit? –

+0

Il sistema operativo deve essere in grado di allocare la quantità richiesta di memoria contigua a R. In tal modo si potrebbe essere limitati da altre applicazioni in esecuzione. – James

risposta

21

Per follow-up sui miei commenti, utilizzare data.table. Ho messo insieme un rapido esempio che corrisponde ai vostri dati per illustrare:

library(data.table) 

dt1 <- data.table(id = 1:908450, matrix(rnorm(908450*32), ncol = 32)) 
dt2 <- data.table(id = 1:908450, rnorm(908450)) 
#set keys 
setkey(dt1, id) 
setkey(dt2, id) 
#check dims 
> dim(dt1) 
[1] 908450  33 
> dim(dt2) 
[1] 908450  2 
#merge together and check system time: 
> system.time(dt3 <- dt1[dt2]) 
    user system elapsed 
    0.43 0.03 0.47 

così ci sono voluti meno di 1/2 secondo a fondersi insieme. Ho preso uno screenshot prima e dopo guardando la mia memoria. Prima dell'unione, stavo usando 3,4 giga di RAM. Quando mi sono unito, è salito a 3.7 e livellato. Penso che ti sarà difficile trovare qualcosa di più di memoria o di tempo efficiente.

Prima: enter image description here

Dopo: enter image description here

+0

Ciao a tutti - Domanda veloce. Ho modificato entrambi i miei dataframes in tabelle di dati usando 'dat1_table <-data.table (data1)' e 'dat2_table <-data.table (data2)'. Ma poi, quando provo a setkey, ottengo l'errore 'Column 2 is length 9 che differisce dalla lunghezza della colonna 1'. Il numero di righe sembra essere lo stesso usando 'dim()' tuttavia. – roody

+0

@roody: è strano. Ho appena provato usando gli esempi sopra facendo loro prima i data.frames, poi convertendomi in data.tables usando il tuo metodo. Non sono in grado di riprodurre l'errore. Sei sicuro che 'data1' e' data2' siano in effetti data.frames? Puoi controllare con 'class()', o 'str()' o 'is.data.frame()'. Puoi anche provare a impostare il tasto quando crei data.table in un unico comando, ad esempio 'dt <- data.table (yourDF, key =" yourKey ")' – Chase

+0

Hi Chase - Apparentemente una variabile data-ora in uno di i set di dati stavano facendo impazzire. E tutto ha funzionato! GRAZIE MILLE! – roody

2

Per quanto mi viene in mente ci sono tre soluzioni:

  • Utilizzare DataTable
  • Utilizzare la memoria di swap (può essere registrabile su macchine * nix)
  • Usa campionamento
Problemi correlati