How MATLAB Allocates Memory

Memory Allocation for Arrays

This topic provides information on how MATLAB® allocates memory when working with arrays and variables. The purpose is to help you use memory more efficiently when writing code. Most of the time, however, you should not need to be concerned with these internal operations as MATLAB handles data storage for you automatically.

Note

Any information on how the MATLAB software handles data internally is subject to change in future releases.

Creating and Modifying Arrays

When you assign a numeric or character array to a variable, MATLAB allocates a contiguous virtual block of memory and stores the array data in that block. MATLAB also stores information about the array data, such as its class and dimensions, in a separate, small block of memory called a header.

If you add new elements to an existing array, MATLAB expands the existing array in memory in a way that keeps its storage contiguous. This usually requires finding a new block of memory large enough to hold the expanded array. MATLAB then copies the contents of the array from its original location to this new block in memory, adds the new elements to the array in this block, and frees up the original array location in memory.

If you remove elements from an existing array, MATLAB keeps the memory storage contiguous by removing the deleted elements, and then compacting its storage in the original memory location.

Working with Large Data Sets.  If you are working with large data sets, you need to be careful when increasing the size of an array to avoid getting errors caused by insufficient memory. If you expand the array beyond the available contiguous memory of its original location, MATLAB must make a copy of the array and set this copy to the new value. During this operation, there are two copies of the original array in memory. This temporarily doubles the amount of memory required for the array and increases the risk of your program running out of memory during execution. It is better to preallocate sufficient memory for the largest potential size of the array at the start. See Preallocation.

Copying Arrays

Internally, multiple variables can point to the same block of data, thus sharing that array's value. When you copy a variable to another variable (e.g., B = A), MATLAB makes a copy of the array reference, but not the array itself. As long as you do not modify the contents of the array, there is no need to store more than one copy of it. If you do modify any elements of the array, MATLAB makes a copy of the array and then modifies that copy.

This example uses the memory function to demonstrate how MATLAB handles copying arrays. memory is available only on Windows® systems.

Start by creating a simple script memUsed.m to display how much memory is being used by your MATLAB process. Put these two lines of code in the script.

[usr, sys] = memory;
usr.MemUsedMATLAB

Get an initial reading of how much memory is being used by your MATLAB process:

format short eng;
memUsed
ans =
   295.4977e+006

Create a 2000-by-2000 numeric array A. This uses about 32MB of memory:

A = magic(2000);
memUsed
ans =
   327.6349e+006

Make a copy of array A in B. As there is no need to have two copies of the array data, MATLAB only makes a copy of the array reference. This requires no significant additional memory:

B = A;
memUsed
ans =
   327.6349e+006

Now modify B by making it one half its original size (that is, set 1000 rows to empty). This requires that MATLAB make a copy of at least the first 1000 rows of the A array, and assign that copy to B:

B(1001:2000,:) = [];
format short;   size(B)
ans =
        1000        2000

Check the memory used again. Even though B is significantly smaller than it was originally, the amount of memory used by the MATLAB process has increased by about 16 MB (1/2 of the 32 MB originally required for A) because B could no longer remain as just a reference to A:

format short eng;   memUsed
ans =
   343.6421e+006

Array Headers

When you assign an array to a variable, MATLAB also stores information about the array (such as class and dimensions) in a separate piece of memory called a header. For most arrays, the memory required to store the header is insignificant. There is a small advantage to storing large data sets in a small number of large arrays as opposed to a large number of small arrays. This is because the former configuration requires fewer array headers.

Structure and Cell Arrays.  For structures and cell arrays, MATLAB creates a header not only for each array, but also for each field of the structure and for each cell of a cell array. Because of this, the amount of memory required to store a structure or cell array depends not only on how much data it holds, but also on how it is constructed.

For example, take a scalar structure array S1 having fields R, G, and B. Each field of size 100-by-50 requires one array header to describe the overall structure, one header for each unique field name, and one header per field for the 1-by-1 structure array. This makes a total of seven array headers for the entire data structure:

S1.R(1:100,1:50)
S1.G(1:100,1:50)
S1.B(1:100,1:50)

On the other hand, take a 100-by-50 structure array S2 in which each element has scalar fields R, G, and B. In this case, you need one array header to describe the overall structure, one for each unique field name, and one per field for each of the 5,000 elements of the structure, making a total of 15,004 array headers for the entire data structure:

S2(1:100,1:50).R
S2(1:100,1:50).G
S2(1:100,1:50).B

Even though S1 and S2 contain the same amount of data, S1 uses significantly less space in memory. Not only is less memory required, but there is a corresponding speed benefit to using the S1 format, as well.

See “Cell Arrays” and “Structures” under Data Structures and Memory.

Memory Usage Reported By the whos Function.  The whos function displays the amount of memory consumed by any variable. For reasons of simplicity, whos reports only the memory used to store the actual data. It does not report storage for the array header, for example.

Function Arguments

MATLAB handles arguments passed in function calls in a similar way. When you pass a variable to a function, you are actually passing a reference to the data that the variable represents. As long as the input data is not modified by the function being called, the variable in the calling function and the variable in the called function point to the same location in memory. If the called function modifies the value of the input data, then MATLAB makes a copy of the original array in a new location in memory, updates that copy with the modified value, and points the input variable in the called function to this new array.

In the example below, function myfun modifies the value of the array passed into it. MATLAB makes a copy in memory of the array pointed to by A, sets variable X as a reference to this new array, and then sets one row of X to zero. The array referenced by A remains unchanged:

A = magic(500);
myfun(A);

function myfun(X)
X(400,:) = 0;

If the calling function needs the modified value of the array it passed to myfun, you need to return the updated array as an output of the called function, as shown here for variable A:

A = magic(500);
A = myfun(A);
sprintf('The new value of A is %d', A)

function Y = myfun(X)
X(400,:) = 0;
Y = X;

Data Structures and Memory

Memory requirements differ for the various types of MATLAB data structures. You might be able to reduce the amount of memory used for these structures by considering how MATLAB stores them.

Numeric Arrays

MATLAB requires 1, 2, 4, or 8 bytes to store 8-bit, 16-bit, 32-bit, and 64-bit signed and unsigned integers, respectively. For floating-point numbers, MATLAB uses 4 or 8 bytes for single and double types. To conserve memory when working with numeric arrays, MathWorks® recommends that you use the smallest integer or floating-point type that contains your data without overflowing. For more information, see Numeric Types.

Complex Arrays

MATLAB uses an interleaved storage representation of complex numbers, where the real and imaginary parts are stored together in a contiguous virtual block of memory. If you make a copy of a complex array, and then modify only the real or imaginary part of the array, MATLAB creates an array containing both real and imaginary parts. For more information, see MATLAB Support for Interleaved Complex API in MEX Functions.

Sparse Matrices

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

Compare two 1000-by-1000 matrices: X, a matrix of doubles with 2/3 of its elements equal to zero; and Y, a sparse copy of X. The following example shows that the sparse matrix requires approximately half as much memory:

whos
  Name      Size                   Bytes  Class

  X      1000x1000               8000000  double array
  Y      1000x1000               4004000  double array (sparse)

Cell Arrays

In addition to data storage, cell arrays require additional memory to store information describing each cell. This information is recorded in a header, and there is one header for each cell of the array. You can determine the amount of memory required for a cell array header by finding the number of bytes consumed by a 1-by-1 cell that contains no data, as shown below for a 64-bit system:

C = {[]};      % Empty cell array
whos C

  Name      Size            Bytes  Class    Attributes

  C         1x1               104  cell

To predict the size of an entire cell array, multiply the header size by the total number of cells in the array, and then add to that the number of bytes required for the data you intend to store in the array:

(header_size x number_of_cells) + data

For example, a 10-by-20 cell array that contains 400 bytes of data would require 21,200 bytes of memory on a 64-bit system:

(104 x 200) + 400 = 21200

Note

While numeric arrays must be stored in contiguous memory, structures and cell arrays do not.

Example – Memory Allocation for a Cell Array.  This 4-by-1 cell array records the brand name, screen size, price, and on-sale status for three laptop computers:

Laptops = {['SuperrrFast 89X', 'ReliablePlus G5', ...
            'UCanA4dIt 140L6']; ...
           [single(17), single(15.4), single(14.1)]; ...
           [2499.99, 1199.99, 499.99]; ...
           [true, true, false]};

On a 64-bit system, the cell array header alone requires 104 bytes per cell:

4 cells * 104 bytes per cell = 416 bytes for the cell array

Calculate the memory required to contain the data in each of the four cells:

45 characters * 2 bytes per char = 90 bytes
 3 singles * 4 bytes per single = 12 bytes
 3 doubles * 8 bytes per double = 24 bytes
 3 logicals * 1 byte per logical = 3 bytes

90 + 12 + 24 + 3 = 129 bytes for the data

Add the two, and then compare your result with the size returned by MATLAB:

416 + 129 = 545 bytes total

whos Laptops
  Name         Size            Bytes  Class    Attributes

  Laptops      4x1               545  cell     

Structures

On a 64-bit system, each field of a structure array requires a 104-byte header. In addition, each unique field name requires a 64-byte header. For example, a structure with one empty field consumes 168 bytes (104 bytes for the field and 64 bytes for the field name):

S.A = [];
whos S

  Name      Size            Bytes  Class     Attributes

  S         1x1               168  struct     

To predict the size of an entire structure array, calculate the total number of header bytes, and then add to that the number of bytes required for the data you intend to store in the array:

number_of_fields x ((number_of_array_elements x field_header_size) + fieldname_header_size) + data

For example, a 4-by-5 structure Clients with fields Address and Phone uses 4,288 bytes just for the headers:

2 x ((20 x 104) + 64) = 4288 bytes

To that sum, you must add the memory required to hold the data assigned to each field. If you assign a 25-character vector to Address and a 12-character vector to Phone in each element of the 4-by-5 Clients array, you need 1,480 bytes for data:

(25+12) characters * 2 bytes per char * 20 elements = 1480 bytes

Add the two and you see that the entire structure consumes 5,768 bytes of memory.

Example – Memory Allocation for a Structure Array.  Calculate the amount of memory required on a 64-bit system to store a 6-by-5 structure array with these field values:

A:  5-by-8-by-6 signed 8-bit integer array
B:  1-by-500 single array
C:  30-by-30 unsigned 16-bit integer array
D:  1-by-23 character array

Construct the array:

A = int8(ones(5,8,6));
B = single(1:500);
C = uint16(magic(30));
D = 'Company Name: MathWorks';

S = struct('f1',A,'f2',B,'f3',C,'f4',D);

for m = 1:6
   for n = 1:5
      S(m,n) = S(1,1);
   end
end

Calculate the amount of memory required for the structure itself, and then for the data it contains:

structure = fields x ((array elements x 104) + 64) =
            4 x ((30 x 104) + 64) = 12,736 bytes

data = (field1 + field2 + field3 + field4) x array elements =
       (240 + 2000 + 1800 + 46) x 30 = 122,580 bytes

Add the two, and then compare your result with the size returned by MATLAB:

Total bytes calculated for structure S: 12,736 + 122,580 = 135,316

whos S

  Name      Size             Bytes  Class     Attributes

  S         6x5             135316  struct