Main Content

La traducción de esta página está obsoleta. Haga clic aquí para ver la última versión en inglés.

Resolver errores de memoria insuficiente

En este tema se explican varias estrategias que puede utilizar en situaciones en las que MATLAB® se queda sin memoria. MATLAB es una aplicación de 64 bits que se ejecuta en sistemas operativos de 64 bits. Devuelve un mensaje de error cuando solicita un segmento de memoria del sistema operativo mayor que el espacio disponible.

MATLAB cuenta con protección integrada frente a la creación de arreglos demasiado grandes. De forma predeterminada, MATLAB puede utilizar hasta el 100% de la RAM (sin incluir la memoria virtual) de su ordenador para asignar memoria para los arreglos y, si un arreglo supera dicho umbral, MATLAB devuelve un error. Por ejemplo, esta instrucción intenta crear un arreglo con un tamaño excesivo:

A = rand(1e6,1e6);
Error using rand
Requested 1000000x1000000 (7450.6GB) array exceeds maximum array size preference. Creation of arrays greater than this limit may take a long time and cause
MATLAB to become unresponsive.

More information
Consulte Espacio de trabajo y preferencias de variables para obtener información sobre el ajuste del límite de tamaño de este arreglo. Si desactiva el límite de tamaño del arreglo, MATLAB devuelve un error diferente:

A = rand(1e6,1e6);
Out of memory.

More information

Independientemente del motivo por el que se encuentre con los límites de memoria, hay varias soluciones disponibles en función de sus objetivos. Las técnicas que se tratan en Strategies for Efficient Use of Memory pueden ayudarle a optimizar la memoria que tiene disponible, entre ellas:

Si ya utiliza la memoria de forma eficiente y el problema persiste, el resto de secciones de esta página contienen posibles soluciones.

Aprovechar los arreglos tall

Arreglos altos para datos con memoria insuficiente están designados para ayudarle a trabajar con conjuntos de datos demasiado grandes para caber en la memoria. MATLAB trabaja con pequeños bloques de datos a la vez, gestionando automáticamente toda la fragmentación y el procesamiento de los datos en segundo plano. Hay dos formas principales de aprovechar los arreglos altos:

  1. Si tiene un arreglo grande que cabe en la memoria, pero se queda sin memoria cuando intenta realizar cálculos, puede arrojar el arreglo a un arreglo alto:

    B = tall(A)
    Este método le permite trabajar con grandes arreglos que caben en la memoria, pero consumen demasiada memoria para poder realizar copias de los datos durante los cálculos. Por ejemplo, si tiene 8 GB de RAM y una matriz de 5 GB, arrojar la matriz a un arreglo alto le permite realizar cálculos en la matriz sin quedarse sin memoria. Consulte Convert In-Memory Arrays to Tall Arrays para ver un ejemplo de este uso.

  2. Si tiene datos basados en archivos o carpetas, puede crear un datastore y, después, crear un arreglo alto además del almacén de datos:

    ds = datastore('path/to/data.csv');
    tt = tall(ds);
    Este método le proporciona toda la potencia de los arreglos altos en MATLAB: los datos pueden tener cualquier número de filas y MATLAB no se queda sin memoria. Además, puesto que datastore funciona con ubicaciones de datos locales y remotas, los datos con los que trabaja no tienen que estar en el ordenador que utiliza para analizarlos. Para obtener más información, consulte Trabajar con datos remotos.

Aprovechar la memoria de varias máquinas

Si tiene un cluster de ordenadores, puede utilizar Parallel Computing Toolbox™ y Distributed Arrays (Parallel Computing Toolbox) para realizar cálculos con la memoria combinada de todas las máquinas del cluster, lo que le permite operar en todo el arreglo distribuido como una entidad única. Sin embargo, los workers solo operan en su parte del arreglo y, automáticamente, transfieren los datos entre ellos cuando sea necesario.

Crear un arreglo distribuido es muy similar a crear un arreglo alto:

ds = datastore('path/to/data.csv');
dt = distributed(ds);

Cargar solo los datos que se necesiten

Otra posible forma de solucionar los problemas de memoria es importar solo en MATLAB tantos conjuntos de datos grandes como necesite para el problema que está intentando resolver. Esto no suele ser un problema al importar desde fuentes como una base de datos, donde puede buscar explícitamente elementos que coinciden con una consulta. No obstante, es un problema frecuente al cargar grandes archivos de texto plano o binarios.

La función datastore le permite trabajar con grandes conjuntos de datos de forma progresiva. Esta función respalda Arreglos altos para datos con memoria insuficiente y Distributed Arrays (Parallel Computing Toolbox), pero puede utilizarla también para otros fines. Los almacenes de datos son útiles siempre que se desee cargar en la memoria pequeñas porciones de un conjunto de datos a la vez.

Para crear un almacén de datos, es necesario indicar el nombre de un archivo o directorio que contenga una recopilación de archivos con un formato similar. Por ejemplo, con un único archivo:

ds = datastore('path/to/file.csv')
O con una recopilación de archivos en una carpeta:
ds = datastore('path/to/folder/')
También puede utilizar el carácter comodín * para seleccionar todos los archivos de un tipo específico, como en:
ds = datastore('data/*.csv')
Los almacenes de datos admiten una gran variedad de formatos de archivo habituales (datos tabulares, imágenes, hojas de cálculo, etc.). Para obtener más información, consulte Select Datastore for File Format or Application.

Aparte de los almacenes de datos, MATLAB también tiene otras funciones para cargar partes de archivos, como la función matfile para cargar porciones de archivos MAT. En esta tabla se resumen las funciones de carga parcial por tipo de archivo.

Tipo de archivoCarga parcial
Archivo MAT

Cargue parte de una variable indexando en un objeto que cree con la función matfile. Consulte Big data en archivos MAT para ver un ejemplo de este uso.

Texto

Utilice la función textscan para acceder a partes de un archivo de texto grande leyendo solo las columnas y filas seleccionadas. Si especifica el número de filas o un número de formato de repetición con textscan, MATLAB calcula de antemano la cantidad exacta de memoria necesaria.

Binario

Puede utilizar las funciones E/S de archivos binarios de bajo nivel, como fread, para acceder a partes de cualquier archivo que tenga un formato conocido. Para los archivos binarios de formato desconocido, intente usar la aplicación de memoria con la función memmapfile.

Imagen, HDF, audio y vídeo

Muchas de las funciones de MATLAB que admiten cargar desde estos tipos de archivos le permiten seleccionar porciones de los datos que se han de leer. Para obtener más información, consulte las páginas de referencia de las funciones enumeradas en Formatos de archivo compatibles con la importación y exportación.

Aumentar el espacio de intercambio del sistema

La memoria total disponible para las aplicaciones de su ordenador está compuesta de memoria física (RAM), además de un archivo de paginación o archivo de intercambio en el disco. El archivo de intercambio puede ser muy grande (por ejemplo, 512 terabytes en Windows® de 64 bits). El sistema operativo asigna la memoria virtual de cada proceso a la memoria física o al archivo de intercambio, dependiendo de las necesidades del sistema y de otros procesos. Aumentar el tamaño del archivo de intercambio puede aumentar la memoria total disponible, pero también suele provocar un rendimiento más lento.

La mayoría de los sistemas le permiten controlar el tamaño del archivo de intercambio. Los pasos que se han de seguir dependen de su sistema operativo:

  • Sistemas Windows: utilice el panel de control de Windows para cambiar el tamaño del archivo de paginación de la memoria virtual de su sistema. Para obtener más información, consulte la ayuda de Windows.

  • Sistemas Linux®: cambie el espacio de intercambio con los comandos mkswap y swapon. Para obtener más información, escriba man en la línea de comandos de Linux seguido del nombre del comando.

No hay interfaz para controlar directamente el espacio de intercambio en los sistemas macOS.

Establecer el límite de procesos en sistemas Linux

El límite de procesos es la cantidad máxima de memoria virtual que puede ocupar un solo proceso (o aplicación). En el improbable caso de que haya establecido esta preferencia, debe ser lo suficientemente grande para dar cabida a:

  • Todos los datos que se han de procesar

  • Los archivos de programa de MATLAB

  • El ejecutable de MATLAB en sí

  • La información de estado adicional

Los sistemas operativos de 64 bits admiten un límite de procesos de 8 terabytes. En sistemas Linux, consulte el comando ulimit para ver y establecer límites de usuario, incluida la memoria virtual.

Deshabilitar una MV Java en sistemas Linux

En sistemas Linux, si inicia MATLAB sin Java® JVM™, puede aumentar la memoria del área de trabajo disponible en aproximadamente 400 megabytes. Para iniciar MATLAB sin Java JVM, utilice la opción de la línea de comandos -nojvm. Esta opción también aumenta el tamaño del mayor bloque contiguo de memoria en aproximadamente la misma cantidad. Aumentando el mayor bloque contiguo de memoria, se aumenta el mayor tamaño de matriz posible.

Utilizar -nojvm conlleva una penalización con la que se pierden muchas funcionalidades que dependen del software Java, incluido todo el entorno de desarrollo. Al iniciar MATLAB con la opción -nodesktop, no se guardan cantidades considerables de memoria.

Consulte también

Temas relacionados