es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

“No se puede asignar un vector de tamaño 3GB” a pesar de tener 12GB disponibles.

> adj = as.dist(adj)
Error: no se puede asignar un vector de tamaño 3.0 Gb

> system("free -h")
              total        used        free      shared  buff/cache   available
Mem:            14G        2.2G         12G         88M        420M         12G
Swap:            0B          0B          0B

> gc()
           used  (Mb) gc trigger   (Mb)   max used    (Mb)
Ncells  7799796 416.6   16746142  894.4   16746142   894.4
Vcells 41146681 314.0  520945812 3974.6 1665927139 12710.1

¿Por qué no puedo asignar un vector de 3.0GB si tengo 12GB libres? Estoy trabajando en Linux CentOS, así que no tengo acceso a memory.limit() y memory.size().

Esta pregunta general se ha hecho muchas veces. Sin embargo, no veo una respuesta que aborde mi pregunta específica. Estas preguntas son parecidas, pero las únicas respuestas que veo están relacionadas con reducir el tamaño del objeto, usar memory.limit() y memory.size(), o usar bsub -q server_name -R. No sé cómo usar este último dentro de un script y además no responde a mi pregunta de por qué no puedo asignar un vector cuando (aparentemente) tengo suficiente memoria para hacerlo. También he intentado incluir Sys.setenv('R_MAX_VSIZE'=32000000000), pero eso no lo solucionó.

Editar: Agregué la salida de gc(). ¿Importa que los 12GB disponibles sean memoria virtual?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema en este caso es que aunque puede haber suficiente memoria total disponible, el proceso de R no puede asignar un bloque contiguo de memoria lo suficientemente grande para la operación as.dist(). Esto se debe a la fragmentación de memoria, donde la memoria disponible está dispersada en muchos bloques pequeños no utilizados en lugar de consolidarse en un bloque grande no utilizado. Cuando R intenta asignar un bloque grande de memoria, es posible que no pueda encontrar uno del tamaño adecuado y en una ubicación contigua.

    La salida de gc() indica que actualmente hay 12GB de memoria virtual disponible, pero R solo puede acceder a una fracción de este espacio debido a la fragmentación de memoria. La función gc() puede ayudar a liberar algo de memoria eliminando objetos que ya no son necesarios, pero en casos donde se necesitan bloques grandes de memoria, puede no ser suficiente.

    Las posibles soluciones a este problema incluyen optimizar el código para utilizar menos memoria, utilizar una máquina con más memoria física o utilizar un marco de trabajo de computación paralela que pueda distribuir el uso de memoria en varias máquinas.

Comments are closed.