Programming and Data Types    

Managing Memory

This section covers the following topics:

For more information: See Making Efficient Use of Memory in the MATLAB "Programming and Data Types" documentation

Useful Functions for Managing Memory

Several functions that are useful in managing memory are listed below.

Remove variables from memory.
Save existing variables to disk, and then reload them contiguously.
Selectively store variables to disk.
Reload a data file saved with the save function.
Exit MATLAB and return all allocated memory to the system.

Compressing Data in Memory

Since MATLAB uses a heap method of memory management, extended MATLAB sessions may cause memory to become fragmented. When memory is fragmented, there may be plenty of free space, but not enough contiguous memory to store a new large variable. If you get the Out of Memory message from MATLAB, the pack function may be able to compress some of your data in memory, thus freeing up larger contiguous blocks.

For more information: See Ways to Conserve Memory in the MATLAB "Programming and Data Types" documentation

Clearing Unused Variables from Memory

If you use pack and there is still not enough free memory to proceed, you probably need to remove some of the variables you no are longer using from memory. Use clear to do this.

Conserving Memory with Large Amounts of Data

If your program generates very large amounts of data, consider writing the data to disk periodically. After saving that portion of the data, clear the variable from memory and continue with the data generation.

Matrix Manipulation with Sparse Matrices

Matrices with values that are mostly zero are best stored in sparse format. Sparse matrices can use less memory and may also be faster to manipulate than full matrices. You can convert a full matrix to sparse using the sparse function.

For more information: See Converting Full Matrices into Sparse in the MATLAB "Programming and Data Types" documentation, and the sparse function reference page

Structure of Arrays Rather Than Array of Structures

If your MATLAB application needs to store a large amount of data, and the definition of that data lends itself to being stored in either a structure of arrays or an array of structures, the former is preferable. A structure of arrays requires significantly less memory than an array of structures, and also has a corresponding speed benefit.

Preallocating Is Better Than Growing an Array

for and while loops that incrementally increase, or grow, the size of a data structure each time through the loop can adversely affect memory usage and performance. On each iteration, MATLAB has to allocate more memory for the growing matrix and also move data in memory whenever it cannot allocate a contiguous block. This can also result in fragmentation or in used memory not being returned to the operating system.

To avoid this, preallocate a block of memory large enough to hold the matrix at its final size. For example,

For more information: See Preallocating Arrays in the MATLAB "Programming and Data Types" documentation

Use repmat When You Need to Grow Arrays

If you do need to grow an array, see if you can do it using the repmat function. repmat gets you a contiguous block of memory for your expanding array.

Preallocating a Nondouble Matrix

When you preallocate a block of memory to hold a matrix of some type other than double, it is more memory efficient and sometimes faster to use the repmat function for this.

The statement below uses zeros to preallocate a 100-by-100 matrix of uint8. It does this by first creating a full matrix of doubles, and then converting the matrix to uint8. This costs time and uses memory unnecessarily.

Using repmat, you create only one double, thus reducing your memory needs.

For more information: See Preallocating Arrays in the MATLAB "Programming and Data Types" documentation

System-Specific Ways to Use Less Memory

If you run out of memory often, you can allocate your larger matrices earlier in the MATLAB session and also use these system-specific tips:

For UNIX systems, we recommend that your machine be configured with twice as much swap space as you have RAM. The UNIX command, pstat -s, lets you know how much swap space you have.

For more information: See Platform-Specific Memory Topics in the MATLAB "Programming and Data Types" documentation

Out of Memory Errors on UNIX

On UNIX systems, you may get Out of Memory errors when executing an operating system command from within MATLAB (using the shell escape (!) operator). This is because, when a process shells out to a subprocess, UNIX allocates as much memory for the subprocess as has been allocated for the parent process.

For more information: See Running External Programs in the MATLAB "Development Environment" documentation

Reclaiming Memory on UNIX

On UNIX systems, MATLAB does not return memory to the operating system even after variables have been cleared. This is due to the manner in which UNIX manages memory. UNIX does not accept memory back from a program until the program has terminated. So, the amount of memory used in a MATLAB session is not returned to the operating system until you exit MATLAB.

To free up the memory used in your MATLAB session, save your workspace variables, exit MATLAB, and then load your variables back in.

Out of Memory Errors and the JVM

You are more likely to encounter Out of Memory errors when using MATLAB 6.0 or greater, due to the use of the Java virtual machine within MATLAB. On UNIX systems, you can reduce the amount of memory MATLAB uses by starting MATLAB with the -nojvm option. When you use this option, you cannot use the desktop or any of the MATLAB tools that require Java.

Type the following at the UNIX prompt:

For more information: See Running MATLAB without the Java Virtual Machine in the MATLAB "Programming and Data Types" documentation

Memory Requirements for Cell Arrays

The memory requirement for an M-by-N cell array containing the same type of data is

So a 5-by-6 cell array that contains a 10-by-10 real matrix in each cell takes up 27,000 bytes.

Memory Required for Cell Arrays and Structures

Contiguous memory is not required for an entire cell array or structure array. Since each of these is actually an array of pointers to other arrays, the memory for each array needs to be contiguous, but the entire memory collection does not need to be.

Preallocating Cell Arrays to Save Memory

Preallocation of cell arrays is recommended if you know the data type of your cells' components. This makes it unnecessary for MATLAB to grow the cell array each time you assign values.

For example, to preallocate a 1000-by-200 cell array of empty arrays, use

For more information: See Preallocating Arrays in the MATLAB "Programming and Data Types" documentation

  Input/Output Optimizing for Speed