Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Estrategias para el uso eficiente de la memoria

Formas de reducir la cantidad de memoria necesaria

La fuente de muchos problemas "fuera de memoria" a menudo implica analizar o procesar un conjunto grande de datos existente, como en un archivo o una base de datos. Esto requiere incorporar todo o parte del conjunto de datos en el proceso de software.MATLAB® Las técnicas siguientes tratan de minimizar la memoria necesaria durante esta etapa.

Cargue solo la cantidad de datos que necesite

Solo importe en la mayor cantidad de un conjunto de datos grande que necesite para el problema que está intentando resolver.MATLAB Esto no suele ser un problema al importar desde orígenes como una base de datos, donde puede buscar explícitamente elementos que coincidan con una consulta. Pero este es un problema común con la carga de grandes archivos de texto plano o binarios. En lugar de cargar todo el archivo, utilice la función adecuada para cargar partes de archivos.MATLAB

Tipo de archivoCarga parcial
MAT-File

Cargue parte de una variable indexando en un objeto que cree con la función.matfile

Texto

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

Binario

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

Imagen, HDF, audio y vídeo

Muchas de las funciones que soportan la carga de estos tipos de archivos le permiten seleccionar partes de los datos para leerlas.MATLAB Para obtener más información, consulte las páginas de referencia de función enumeradas en.Formatos de archivo admitidos para importación y exportación

Procesar datos por bloques

Considere el procesamiento de bloques, es decir, el procesamiento de un conjunto de datos de gran tamaño de una sección a la vez en un bucle. Al reducir el tamaño de la matriz más grande de un conjunto de datos, se reduce el tamaño de las copias o de los temporarios necesarios. Puede utilizar esta técnica de dos maneras:

  • Para un subconjunto de aplicaciones que puede dividir en fragmentos independientes y procesar de forma independiente.

  • Para las aplicaciones que solo se basan en el estado de un bloque anterior, como el filtrado.

Evite crear matrices temporales

Evite crear variables temporales de gran tamaño, y también haga que sea una práctica para borrar las variables temporales que usa cuando ya no son necesarias. Por ejemplo, cuando se crea una matriz grande de ceros, en lugar de guardar en una variable temporal y, a continuación, convertir a un único:AA

A = zeros(1e6,1); As = single(A);

usar solo el comando One para realizar ambas operaciones:

A = zeros(1e6,1,'single'); 

El uso de la función, la preasignación de matrices y los bucles son otras maneras de trabajar en los datos sin necesidad de almacenamiento temporal en la memoria.repmatfornondouble

Use funciones anidadas para pasar menos argumentos

Cuando trabaje con conjuntos de datos grandes, tenga en cuenta que realiza una copia temporal de una variable de entrada si la función llamada modifica su valor.MATLAB Esto duplica temporalmente la memoria necesaria para almacenar la matriz, lo que provoca que se genere un error si no hay suficiente memoria disponible.MATLAB

Una forma de usar menos memoria en esta situación es usar funciones anidadas. Una función anidada comparte el área de trabajo de todas las funciones externas, lo que proporciona a la función anidada acceso a los datos fuera de su ámbito habitual. En el ejemplo que se muestra aquí, la función anidada tiene acceso directo al área de trabajo de la función externa, lo que hace innecesario pasar una copia de la variable en la llamada de función.setrowvalmyfun Cuando se modifica el valor de, se modifica en el espacio de trabajo de la función de llamada.setrowvalA No hay necesidad de utilizar memoria adicional para mantener una matriz separada para la función que se llama, y tampoco hay necesidad de devolver el valor modificado de:A

function myfun A = magic(500);     function setrowval(row, value)    A(row,:) = value;    end  setrowval(400, 0); disp('The new value of A(399:401,1:10) is') A(399:401,1:10) end 

El uso de almacenamiento de datos adecuado

proporciona diferentes tamaños de clases de datos, como y, por lo que no es necesario utilizar clases grandes para almacenar los segmentos de datos más pequeños.MATLABdoubleuint8 Por ejemplo, se necesita 7 KB menos de memoria para almacenar 1.000 pequeños valores enteros sin signo con la clase que con.uint8double

Utilice la clase numérica adecuada

La clase numérica que debe usar depende de las acciones previstas.MATLAB La clase predeterminada proporciona la mejor precisión, pero requiere 8 bytes por elemento de memoria para almacenar.double Si tiene la intención de realizar cálculos complicados como el álgebra lineal, debe usar una clase de punto flotante como un o.doublesingle La clase solo requiere 4 bytes.single Hay algunas limitaciones en lo que puede hacer con la clase, pero la mayoría de las operaciones matemáticas son compatibles.singleMATLAB

Si solo necesita realizar aritmética simple y representa los datos originales como enteros, puede usar las clases de enteros en.MATLAB A continuación se muestra una lista de clases numéricas, requisitos de memoria (en bytes) y las operaciones admitidas.

Clase (tipo de datos)BytesOperaciones admitidas
single4La mayoría de las matemáticas
double8Todas las matemáticas
logical1Operaciones lógicas/condicionales
int8, uint81Aritmética y algunas funciones simples
int16, uint162Aritmética y algunas funciones simples
int32, uint324Aritmética y algunas funciones simples
int64, int648Aritmética y algunas funciones simples

Reduzca la cantidad de sobrecarga al almacenar datos

las matrices (implementadas internamente como) requieren espacio para almacenar la metainformación sobre los datos en la memoria, como el tipo, las dimensiones y los atributos.MATLABmxArrays Esto tarda unos 80 bytes por matriz. Esta sobrecarga solo se convierte en un problema cuando tiene un número grande (por ejemplo, cientos o miles) de pequeños (por ejemplo, escalares).mxArrays El comando enumera la memoria utilizada por las variables, pero no incluye esta sobrecarga.whos

Dado que las matrices numéricas simples (que comprenden una) tienen la menor sobrecarga, debe usarlas siempre que sea posible.mxArray Cuando los datos son demasiado complejos para almacenarlos en una matriz simple (o matriz), puede usar otras estructuras de datos.

Las matrices de celdas se componen por separado para cada elemento.mxArrays Como resultado, las matrices de celdas con muchos elementos pequeños tienen una gran sobrecarga.

Las estructuras requieren una cantidad similar de sobrecarga por campo (véase).Encabezados de matriz Las estructuras con muchos campos y pequeños contenidos tienen una gran sobrecarga y deben evitarse. Una gran matriz de estructuras con campos escalares numéricos requiere mucha más memoria que una estructura con campos que contienen matrices numéricas grandes.

Tenga en cuenta también que mientras almacena matrices numéricas en memoria contigua, este no es el caso de las estructuras y matrices de celdas.MATLAB

Importar datos a la clase apropiadaMATLAB

Al leer datos de un archivo binario con, es un error común especificar solo la clase de los datos en el archivo, y no la clase de los datos se utiliza una vez que está en el área de trabajo.freadMATLAB Como resultado, el valor predeterminado se utiliza incluso si está leyendo sólo los valores de 8 bits.double Por ejemplo,

fid = fopen('large_file_of_uint8s.bin', 'r');  a = fread(fid, 1e3, 'uint8');              % Requires 8k  whos a   Name         Size            Bytes  Class    Attributes     a         1000x1              8000  double        a = fread(fid, 1e3, 'uint8=>uint8');       % Requires 1k  whos a   Name         Size            Bytes  Class    Attributes     a         1000x1              1000  uint8

Hacer matrices dispersas cuando sea posible

Si los datos contienen muchos ceros, considere la posibilidad de usar matrices dispersas, que almacenan solo los elementos distintos de cero. En el ejemplo siguiente se compara el espacio necesario para el almacenamiento de una matriz de ceros principalmente:

A = eye(1000);        % Full matrix with ones on the diagonal As = sparse(A);       % Sparse matrix with only nonzero elements whos   Name         Size                Bytes  Class     Attributes    A         1000x1000            8000000  double                 As        1000x1000              24008  double    sparse  

Puede ver que esta matriz requiere sólo aproximadamente 4 KB para almacenarse como disperso, pero aproximadamente 8 MB como una matriz completa. En general, para una matriz doble dispersa con elementos y columnas distintos de cero, la memoria necesaria esnnzncol

  • 16 * + 8 * + 8 bytes (en una máquina de 64 bits)nnzncol

  • 12 * + 4 * + 4 bytes (en una máquina de 32 bits)nnzncol

Tenga en cuenta que no admite todas las operaciones matemáticas en matrices dispersas.MATLAB

Cómo evitar fragmentar la memoria

siempre utiliza un segmento de memoria contiguo para almacenar una matriz numérica.MATLAB Sin embargo, al manipular estos datos, el bloque contiguo puede fragmentarse. Cuando la memoria está fragmentada, puede haber un montón de espacio libre, pero no suficiente memoria contigua para almacenar una nueva variable grande. El aumento de la fragmentación puede utilizar significativamente más memoria de la necesaria.

Preasigne memoria contigua al crear matrices

En el transcurso de una sesión, la memoria puede fragmentarse debido a la asignación de memoria dinámica y la desasignación. y bucles que aumentan incrementalmente, o el tamaño de una estructura de datos cada vez a través del bucle puede Agregar a esta fragmentación, ya que tienen que encontrar repetidamente y asignar bloques de memoria más grandes para almacenar los datos.MATLABforwhilegrow

Para hacer un uso más eficiente de la memoria, preasigne un bloque de memoria lo suficientemente grande como para sostener la matriz en su tamaño final antes de entrar en el bucle. Cuando se preasigna memoria para una matriz, se reserva suficiente espacio contiguo para toda la matriz de tamaño completo al principio del cálculo.MATLAB Una vez que tenga este espacio, puede agregar elementos a la matriz sin tener que asignar continuamente nuevo espacio para él en la memoria.

Para obtener más información sobre la preasignación, consulte.La preasignación

Asigne sus matrices más grandes primero

utiliza un método de montón de administración de memoria.MATLAB Solicita memoria del sistema operativo cuando no hay suficiente memoria disponible en el montón para almacenar las variables actuales. Reutiliza la memoria siempre que el tamaño del segmento de memoria necesario esté disponible en el montón.

Las siguientes instrucciones pueden requerir aproximadamente 4,3 MB de RAM. Esto se debe a que es posible que no pueda reutilizar el espacio ocupado anteriormente por dos matrices de 1 MB al asignar espacio para una matriz de 2,3 MB:MATLAB

a = rand(1e6,1); b = rand(1e6,1); clear c = rand(2.3e6,1); 

La forma más sencilla de evitar la sobreasignación de memoria es asignar primero los vectores más grandes. Estas declaraciones requieren solamente alrededor de 2,0 MB de RAM:

c = rand(2.3e6,1); clear a = rand(1e6,1); b = rand(1e6,1); 

Uso a largo plazo (solo sistemas)Windows

En 32 bits, el espacio de trabajo de puede fragmentar con el tiempo debido al hecho de que el administrador de memoria no devuelve bloques de ciertos tipos y tamaños al sistema operativo.Microsoft®Windows®MATLABWindows Borrar el espacio de trabajo no soluciona este problema.MATLAB Puede minimizar el problema asignando primero las variables más grandes. Esto no puede abordar, sin embargo, la eventual fragmentación del espacio de trabajo que se produce por el uso continuo de muchos días y semanas, por ejemplo.MATLAB La única solución a esto es guardar su trabajo y reiniciar.MATLAB

El comando, que guarda todas las variables en el disco y las carga de nuevo, no ayuda con esta situación.pack

Reclamar memoria usada

Una forma sencilla de aumentar la cantidad de memoria que tiene disponible es borrar matrices grandes que ya no utilice.

Guarde sus datos grandes periódicamente en el disco

Si el programa genera cantidades muy grandes de datos, considere la posibilidad de escribir los datos en el disco periódicamente. Después de guardar esa parte de los datos, utilice la función para eliminar la variable de la memoria y continuar con la generación de datos.clear

Borre las variables antiguas de la memoria cuando ya no sea necesario

Cuando trabaje con un conjunto de datos muy grande de forma repetida o interactiva, borre primero la variable antigua para crear espacio para la nueva variable. De lo contrario, requiere almacenamiento temporal del mismo tamaño antes de invalidar la variable.MATLAB Por ejemplo,

a = Rand (100e6, 1)% 800 MB array b = Rand (100e6, 1)% nuevo error de matriz 800 MB usando Rand de memoria. Escriba HELP MEMORY para sus opciones.   Clear a = Rand (100e6, 1)% nueva matriz de 800 MB