2011-01-16 18 views
6

He leído varios hilos sobre problemas de memoria en R y parece que no puedo encontrar una solución a mi problema.R estadísticas - problemas de memoria al asignar una gran matriz/Linux

Estoy ejecutando una especie de regresión LASSO en varios subconjuntos de un gran conjunto de datos. Para algunos subconjuntos funciona bien, y para algunos subconjuntos más grandes no funciona, con errores de tipo "no se puede asignar un vector de tamaño 1,6 Gb". El error se produce en esta línea del código:

example <- cv.glmnet(x=bigmatrix, y=price, nfolds=3) 

También depende de la cantidad de variables que se incluyeron en "bigmatrix".

Probé R y R64 para Mac y R para PC pero recientemente fui a una máquina virtual más rápida en Linux pensando que evitaría cualquier problema de memoria. Era mejor, pero aún tenía algunos límites, aunque memory.limit indica "Inf".

¿Hay alguna forma de hacerlo funcionar o tengo que cortar algunas variables en la matriz o tomar un subconjunto de datos más pequeño?

He leído que R está buscando algunos trozos contiguos de memoria y que tal vez debería preasignar la matriz? Alguna idea ?

+1

Con espacio de direcciones de 64 bits plano, la búsqueda de espacio de direcciones contiguo no será un problema. –

Respuesta

8

Déjenme construir un poco sobre lo que dijo @richardh. Toda la información que cargues con R mastica la RAM. Entonces cargas tus datos principales y usa un poco de RAM. Luego, subconjuntos de los datos para que el subconjunto use un trozo más pequeño. Entonces, el algoritmo de regresión necesita un trozo que sea mayor que su subconjunto, ya que realiza algunas manipulaciones y giros. A veces soy capaz de un mejor uso de memoria RAM de la siguiente manera:

  1. salvo el primer conjunto de datos en el disco usando save()
  2. tomar un subconjunto de los datos
  3. rm() el primer conjunto de datos por lo que es ya no está en la memoria
  4. hacer el análisis en el subconjunto
  5. Guardar resultados del análisis
  6. totalmente volcado de todos los artículos en la memoria: rm (lista = ls())
  7. carga la inicial d ataset desde el paso 1 de nuevo en el uso de memoria RAM de carga()
  8. bucle de los pasos 2-7, según sea necesario

tener cuidado con el paso 6 y tratar de no disparar su ojo hacia fuera. Que vuelca TODO en la memoria R. Si no se ha guardado, se habrá ido. Un enfoque más sutil sería eliminar los objetos grandes que está seguro de que no necesita y no hacer el rm (list = ls()).

Si aún necesita más RAM, es posible que desee ejecutar su análisis en la nube de Amazon. Su High-Memory Quadruple Extra Large Instance tiene más de 68 GB de RAM. A veces, cuando me encuentro con restricciones de memoria, encuentro que lo más fácil es ir a la nube donde puedo estar tan descuidado con la memoria RAM como quiero.

Jeremy Anglim tiene un buen blog post que incluye algunos consejos sobre la gestión de la memoria en R. En esa publicación del blog, Jeremy enlaza con this previous StackOverflow question, lo que encontré útil.

+0

@JD - ¡Mejor dicho! Estoy (lentamente) aprendiendo las formas. Y buen hallazgo en la pregunta anterior. –

+0

Tu respuesta fue buena. Acabo de lanzar algunos más en la parte superior ya que sospechaba que el OP podría no captar exactamente a lo que te referías. –

2

No creo que esto tenga que ver con la memoria continua, sino solo que R por defecto solo funciona en la RAM (es decir, no puede escribir en la memoria caché). Farnsworth's guide to econometrics in R menciona el paquete filehash para habilitar la escritura en el disco, pero no tengo ninguna experiencia con él.

Su mejor opción puede ser trabajar con subconjuntos más pequeños, administrar memoria manualmente eliminando variables que no necesita con rm (es decir, ejecutar regresión, almacenar resultados, eliminar matriz antigua, cargar matriz nueva, repetir) y/o obteniendo más RAM HTH.

+1

La falta de memoria RAM normalmente no daría lugar a errores de falta de memoria. El sistema usaría paginación para lidiar con la falta de RAM física. Es posible que vea agitación, pero ¿por qué vería una falla de asignación? –

+0

@davide ¿tiene experiencia con R o está hablando sin experiencia con otro software? R sin duda fallará si se queda sin memoria RAM. –

+0

@JD ¿Qué hay de paginación? ¿R explícitamente desactiva la búsqueda en el disco? –

0

Probar bigmemory package. Es muy fácil de usar. La idea es que los datos se almacenen en un archivo en HDD y usted cree un objeto en R como referencia para este archivo. He probado este y funciona muy bien.

También hay algunas alternativas, como "ff". Consulte CRAN Task View: High-Performance and Parallel Computing with R para obtener más información.

+1

Acabo de probar el paquete bigmemory y el paquete ff. El paquete ff parece mejor. ¡Es crástico! ;-) –

+0

¿qué hay de cargar datos desde un servidor SQL? – user702846

Cuestiones relacionadas