solve - R gestión de memoria/no puede asignar vector de tamaño n Mb
r error cannot allocate vector of size 3.1 gb (7)
Aquí hay una presentación sobre este tema que puede ser interesante:
http://www.bytemining.com/2010/08/taking-r-to-the-limit-part-ii-large-datasets-in-r/
No he probado las cosas discutidas por mí mismo, pero el paquete bigmemory
parece muy útil
Me estoy encontrando con problemas al tratar de usar objetos grandes en R. Por ejemplo:
> 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
Entiendo que esto está relacionado con la dificultad de obtener bloques contiguos de memoria (desde here ):
Los mensajes de error que comienzan no pueden asignar un vector de tamaño indican una falla al obtener memoria, ya sea porque el tamaño excedió el límite de espacio de direcciones para un proceso o, más probablemente, porque el sistema no pudo proporcionar la memoria. Tenga en cuenta que en una compilación de 32 bits puede haber suficiente memoria libre disponible, pero no un bloque de espacio contiguo lo suficientemente grande para mapearla.
¿Cómo puedo evitar esto? Mi principal dificultad es que llego a cierto punto en mi script y R no puede asignar 200-300 Mb para un objeto ... Realmente no puedo asignar previamente el bloque porque necesito la memoria para otro procesamiento. Esto sucede incluso cuando elimino innecesariamente objetos innecesarios.
EDITAR: Sí, lo siento: 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
Considere si realmente necesita todos estos datos explícitamente, o puede la matriz ser escasa? Existe un buen soporte en R (vea el paquete Matrix
por ejemplo) para matrices dispersas.
Mantenga todos los demás procesos y objetos en R al mínimo cuando necesite hacer objetos de este tamaño. Use gc()
para borrar la memoria que no se usó o, mejor, cree el objeto que necesita en una sola sesión .
Si lo anterior no puede ser de ayuda, obtenga una máquina de 64 bits con tanta RAM como pueda, e instale R. de 64 bits.
Si no puede hacer eso, hay muchos servicios en línea para computación remota.
Si no puede hacer eso, las herramientas de mapeo de memoria como el paquete ff
(o bigmemory
como menciona Sascha) lo ayudarán a construir una nueva solución. En mi experiencia limitada, ff
es el paquete más avanzado, pero debe leer el tema High Performance Computing
en las vistas de tareas de CRAN.
El método de guardar / cargar mencionado anteriormente funciona para mí. No estoy seguro de cómo / if gc()
desfragmenta la memoria, pero parece que funciona.
# defrag memory
save.image(file="temp.RData")
rm(list=ls())
load(file="temp.RData")
Encontré un problema similar y utilicé 2 unidades flash como ''ReadyBoost''. Las dos unidades dieron un aumento adicional de memoria de 8GB (para caché) y resolvió el problema y también aumentó la velocidad del sistema como un todo. Para usar Readyboost, haga clic derecho en la unidad, vaya a propiedades y seleccione ''ReadyBoost'' y seleccione el botón de radio ''usar este dispositivo'' y haga clic en aplicar o en Aceptar para configurar.
La forma más sencilla de eludir esta limitación es cambiar a 64 bit R.
Para los usuarios de Windows, lo siguiente me ayudó mucho a comprender algunas limitaciones de memoria:
- antes de abrir R, abra el Monitor de recursos de Windows (Ctrl-Alt-Delete / Inicie el Administrador de tareas / pestaña Rendimiento / haga clic en el botón inferior "Monitor de recursos" / ficha Memoria)
- Verá cuánta memoria RAM ya usamos antes de abrir R, y por qué aplicaciones. En mi caso, se utilizan 1,6 GB del total de 4 GB. Así que solo podré obtener 2.4 GB para R, pero ahora viene lo peor ...
- abra R y cree un conjunto de datos de 1.5 GB, luego reduzca su tamaño a 0.5 GB, el Monitor de Recursos muestra que mi RAM se usa en casi el 95%.
- use
gc()
para hacer recolección de basura => funciona, puedo ver que el uso de la memoria baje a 2 GB
Consejos adicionales que funcionan en mi máquina:
- prepare las características, guárdelo como un archivo RData, cierre R, vuelva a abrir R y cargue las características del tren. El Administrador de recursos generalmente muestra un menor uso de memoria, lo que significa que incluso gc () no recupera toda la memoria posible y el cierre / reapertura de R funciona mejor para comenzar con la memoria máxima disponible .
- el otro truco es cargar solo el tren configurado para el entrenamiento (no cargue el conjunto de prueba, que normalmente puede ser la mitad del tamaño del tren). La fase de entrenamiento puede usar la memoria al máximo (100%), por lo que cualquier cosa disponible es útil. Todo esto es tomarlo con un grano de sal ya que estoy experimentando con los límites de memoria R.
Si está ejecutando su script en el entorno Linux, puede usar este comando:
bsub -q server_name -R "rusage[mem=requested_memory]" "Rscript script_name.R"
y el servidor asignará la memoria solicitada por usted (de acuerdo con los límites del servidor, pero con un buen servidor - se pueden usar archivos enormes)