2011-12-21 7 views
6

He golpeado una pared tratando de combinar un archivo grande y uno más pequeño. Tengo readmany otras publicaciones sobre administración de memoria en R, y no he podido encontrar un método no extremo (vaya a 64 bits, cargue en un clúster, etc.) para resolverlo. He intentado un poco con el paquete bigmemory, pero no he podido encontrar una solución. Pensé en intentarlo aquí antes de levantar las manos en señal de frustración.Big Merge/administración de memoria

El código que estoy corriendo es como el siguiente:

#rm(list=ls()) 
localtempdir<- "F:/Temp/" 
memory.limit(size=4095) 
[1] 4095 
    memory.size(max=TRUE) 
[1] 487.56 
gc() 
     used (Mb) gc trigger (Mb) max used (Mb) 
Ncells 170485 4.6  350000 9.4 350000 9.4 
Vcells 102975 0.8 52633376 401.6 62529185 477.1 

client_daily<-read.csv(paste(localtempdir,"client_daily.csv",sep=""),header=TRUE) 
object.size(client_daily) 
>130MB 

sbp_demos<-read.csv(paste(localtempdir,"sbp_demos",sep="")) 
object.size(demos) 
>0.16MB 
client_daily<-merge(client_daily,sbp_demos,by.x="OBID",by.y="OBID",all.x=TRUE) 
Error: cannot allocate vector of size 5.0 MB 

Creo que estoy preguntando ¿hay formas inteligentes de todo esto que no implican la compra de nuevo hardware?

  1. Necesito poder merge para crear un objeto más grande.
  2. Voy a necesitar hacer regresiones, etc. con ese objeto más grande.

¿Debería darme por vencido? ¿Bigmemory debería poder ayudar a resolver esto?

Cualquier orientación muy apreciada.

Detalles: R versión 2.13.1 (2011-07-08) Plataforma: i386-pc-mingw32/i386 (32-bit) Intel 2 Duo Core @ 2,33 GHz, 3.48GB RAM

+4

¿Has mirado el paquete 'data.table'? Es * rápido * para grandes fusiones, y casualmente puede ser más eficiente con la memoria para arrancar? – Chase

+0

Esto probablemente no resolverá su problema, pero aquí hay algo que puede intentar. Si hay columnas en cualquiera de los conjuntos de datos que no necesita: elimínelas después de leer los datos, ejecute un gc(), y luego intente la fusión nuevamente. Otra idea es convertir sus datos a una matriz si es posible, ya que tienden a consumir menos memoria. – Rguy

Respuesta

8

Como ya mencionó Chase, puede intentar data.table o quizás sqldf.

Para cualquiera de los dos, es probable que obtenga más jugo si configura los índices de forma adecuada.

Con data.table lo haría:

dt1 <- data.table(sbp_demos, key='OBID') 
dt2 <- data.table(client_daily, key='OBID') 

## Do an INNER JOIN-like operation, where non-matching rows are removed 
mi <- dt1[dt2, nomatch=0] 

## Do a RIGHT JOIN(?)-like operation ... all rows in dt2 will be returned. 
## If there is no matching row in dt1, the values in the dt1 columns for 
## the merged row will be NA 
mr <- dt1[dt2] 

Si usted va la ruta sqldf, look at example 4i on its website ... de nuevo, asegúrese de usar correctamente los índices.