Me encuentro 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 aquí ):
Los mensajes de error que comienzan no pueden asignar el vector de tamaño indican que no se pudo 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 contiguo de espacio de direcciones lo suficientemente grande como para asignarlo.
¿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 preasignar el bloque porque necesito la memoria para otro procesamiento. Esto sucede incluso cuando elimino diligentemente objetos innecesarios.
EDITAR: Sí, lo siento: Windows XP SP3, 4 Gb de 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
Calloc
y conFree
memoria, pero sospecho que esto no es lo que Benjamin está haciendo.Respuestas:
Considere si realmente necesita todos estos datos explícitamente, o ¿puede la matriz ser escasa? Hay un buen soporte en R (vea el
Matrix
paquete, 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. Úselo
gc()
para borrar la memoria ahora no utilizada o, mejor, solo cree el objeto que necesita en una sesión .Si lo anterior no puede ayudar, obtenga una máquina de 64 bits con tanta RAM como pueda, e instale R. de 64 bits
Si no puede hacerlo, hay muchos servicios en línea para la informática remota.
Si no puede hacer eso, las herramientas de mapeo de memoria como el paquete
ff
(obigmemory
como Sascha menciona) lo ayudarán a construir una nueva solución. En mi experiencia limitadaff
es el paquete más avanzado, pero debe leer elHigh Performance Computing
tema en Vistas de tareas CRAN.fuente
Para los usuarios de Windows, lo siguiente me ayudó mucho a comprender algunas limitaciones de memoria:
gc()
para hacer la recolección de basura => funciona, puedo ver que el uso de memoria se reduce a 2 GBConsejos adicionales que funcionan en mi máquina:
fuente
gc()
es solo una ilusión. Comprobar el Administrador de tareas es solo una operación muy básica de Windows. El único consejo con el que estoy de acuerdo es guardar en formato .RDatagc()
no funciona. Solo quiero decir que R lo hace automáticamente, por lo que no necesita hacerlo manualmente. Ver aquígc()
¿Funciona ? Simplemente no necesita usarlo porque R lo hace internamenteAquí hay una presentación sobre este tema que puede encontrar interesante:
http://www.bytemining.com/2010/08/taking-r-to-the-limit-part-ii-large-datasets-in-r/
No he probado las cosas discutidas yo mismo, pero el
bigmemory
paquete parece muy útil.fuente
La forma más sencilla de eludir esta limitación es cambiar a 64 bits R.
fuente
Error: cannot allocate vector of size ... Gb
(pero sí, tengo muchos datos).Encontré un problema similar y usé 2 unidades flash como 'ReadyBoost'. Las dos unidades dieron un impulso adicional de 8GB de memoria (para caché) y resolvió el problema y también aumentó la velocidad del sistema en su conjunto. Para usar Readyboost, haga clic derecho en la unidad, vaya a propiedades y seleccione 'ReadyBoost' y seleccione el botón de opción 'usar este dispositivo' y haga clic en Aplicar o Aceptar para configurar.
fuente
Seguí a la página de ayuda de memor.limit y descubrí que en mi computadora R por defecto puede usar hasta ~ 1.5 GB de RAM y que el usuario puede aumentar este límite. Usando el siguiente código,
Me ayudó a resolver mi problema.
fuente
Si está ejecutando su script en un entorno Linux, puede usar este comando:
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 enormes archivos)
fuente
server_name
? Me encuentrocannot allocate vector size...
con esto tratando de hacer una gran matriz de términos y documentos en un AMI y no puedo entender por qué no tiene suficiente memoria o cuánto más necesito alquilar. ¡Gracias!El método de guardar / cargar mencionado anteriormente funciona para mí. No estoy seguro de cómo / si
gc()
desfragmenta la memoria, pero esto parece funcionar.fuente