Как MATLAB выделяет память

Эта тема предоставляет информацию о том, как MATLAB® выделяет память при работе с переменными. Эта информация, как любая информация о том, как MATLAB обрабатывает данные внутренне, подвержена изменениям в будущих релизах.

Выделение памяти для массивов

Когда вы присваиваете числовое или символьный массив к переменной, MATLAB выделяет непрерывный блок памяти и хранит данные массива в том блоке. MATLAB также хранит информацию о данных массива, таких как его класс, и размерности, в маленьком, отдельном блоке памяти вызвали заголовок. Для большинства массивов память, требуемая сохранить заголовок, незначительна. Однако могло быть некоторое преимущество для хранения больших наборов данных в небольшом количестве больших массивов в противоположность большому количеству небольших массивов. Это вызвано тем, что меньше массивов требует меньшего количества заголовков массивов.

Если вы добавляете новые элементы в существующий массив, MATLAB расширяет массив в памяти способом, которая сохраняет ее устройство хранения данных непрерывным. Это обычно требует, чтобы нахождение нового блока памяти, достаточно большой, содержало расширенный массив. MATLAB затем копирует содержимое массива от его исходного местоположения до этого нового блока в памяти, добавляет новые элементы в массив в этом блоке и освобождает местоположение исходного массива в памяти.

Если вы удаляете элементы из существующего массива, MATLAB сохраняет устройство хранения данных памяти непрерывным путем удаления удаленных элементов, и затем уплотнения его устройства хранения данных в исходной ячейке памяти.

Копирование массивов

Когда вы присваиваете массив второй переменной (например, когда вы выполняете B = A), MATLAB не выделяет новую память сразу же. Вместо этого это создает копию ссылки на массив. Пока вы не изменяете содержимое блока памяти, ссылаемого A и B, нет никакой потребности сохранить больше чем одну копию данных. Однако, если вы изменяете какие-либо элементы блока памяти с помощью любого A или B, MATLAB выделяет новую память, копирует данные в него, и затем изменяет созданную копию.

В системах Windows®, memory функция позволяет вам смотреть детали памяти. Чтобы видеть, как копирование массивов влияет на использование памяти в вашей системе Windows, создайте функциональный memUsed в файле в вашей текущей папке. Вызовы функции memory возвратить объем памяти, используемый вашим процессом MATLAB в мегабайтах.

function y = memUsed
usr = memory;
y = usr.MemUsedMATLAB/1e6;

Вызовите memUsed отобразить текущее использование памяти.

format shortG
memUsed
ans = 
       3966.1

Создайте 2000 2000 числовой массив и наблюдайте изменение в использовании памяти. Массив использует приблизительно 32 Мбайта памяти.

A = magic(2000);
memUsed
ans = 
       3998.1

Сделайте копию A в B. Поскольку нет никакой потребности иметь две копии данных массива, MATLAB только делает копию ссылки на массив. Это не требует никакой значительной дополнительной памяти.

B = A;
memUsed
ans = 
       3998.1

Теперь измените B путем удаления половины его строк. Поскольку A и B больше не указывайте на те же данные, MATLAB должен выделить отдельный блок памяти B. В результате объем памяти, используемый процессом MATLAB, увеличивается размером B, который составляет приблизительно 16 Мбайт (одна половина 32 Мбайт, требуемых для A).

B(1001:2000,:) = [];
memUsed
ans = 
       4014.1

Аргументы функции

MATLAB обрабатывает аргументы, переданные в вызовах функции таким же образом, что он обрабатывает скопированные массивы. Когда вы передаете переменную функции, вы на самом деле передаете ссылку на данные, которые представляет переменная. Пока данные не изменяются вызванной функцией, переменной в функции вызова или скрипте и переменной в названной единице функциональности к тому же местоположению в памяти. Если вызванная функция изменяет значение входных данных, то MATLAB делает копию исходной переменной в новом месте в памяти, обновления, которые копируют с модифицированным значением, и указывает входной параметр в вызванной функции к этому новому местоположению.

Например, рассмотрите функциональный myfun, то, которое изменяет значение массива, передало ему. MATLAB делает копию A в новом месте в памяти, устанавливает переменную X как ссылка на эту копию, и затем устанавливает одну строку X обнулять. На массив ссылается A остается неизменным.

A = magic(5);
myfun(A)

function myfun(X)
X(4,:) = 0;
disp(X)
end

Если для функции вызова или скрипта нужно модифицированное значение массива, это передало myfun, необходимо возвратить обновленный массив как выход вызванной функции.

Типы данных и память

Требования к памяти отличаются для типов данных MATLAB. Вы можете смочь уменьшать объем памяти, используемый вашим кодом путем изучения, как MATLAB обрабатывает различные типы данных.

Числовые массивы

MATLAB выделяет 1, 2, 4, или 8 байтов к 8-битным, 16-битным, 32-битным, и 64-битным целым числам со знаком и беззнаковому целому, соответственно. Это представляет числа с плавающей запятой в любом с двойной точностью (double) или с одинарной точностью (singleформат. Поскольку MATLAB хранит количества типа single с помощью 4 байтов они требуют меньшей памяти, чем количества типа double, которые используют 8 байтов. Однако, потому что они хранятся с меньшим количеством битов, количеств типа single представлены меньшей точности, чем количества типа double. В MATLAB, double тип числовых данных по умолчанию и обеспечивает достаточную точность для большинства вычислительных задач. Для получения дополнительной информации смотрите Числа с плавающей запятой.

Структура и Массивы ячеек

В то время как числовые массивы должны храниться в непрерывном блоке памяти, структуры и массивы ячеек могут храниться в блоках, состоящих из нескольких несмежных участков. Для структур и массивов ячеек, MATLAB создает заголовок не только для массива, но также и для каждого поля структуры или каждой ячейки массива ячеек. Поэтому объем памяти, требуемый сохранить массив структур или массив ячеек, зависит не только от того, сколько данных это содержит, но также и от того, как это создается.

Например, считайте скалярную структуру S1 с полями RG, и B, где каждое поле содержит 100 50 массив. S1 требует, чтобы один заголовок описал полную структуру, один заголовок для каждого уникального имени поля и один заголовок для каждого поля. Это делает в общей сложности семь заголовков для целой структуры.

S1.R = zeros(100,50);
S1.G = zeros(100,50);
S1.B = zeros(100,50);

С другой стороны, рассмотрите 100 50 массив структур S2 в котором каждый элемент имеет скалярные поля RG, и B. В этом случае, S2 потребности один заголовок, чтобы описать полную структуру, один заголовок для каждого уникального имени поля и один заголовок для каждого поля этих 5 000 элементов, делая в общей сложности 15 004 заголовка массивов для целого массива структур.

for i = 1:100
    for j=1:50
        S2(i,j).R = 0;
        S2(i,j).G = 0;
        S2(i,j).B = 0;
    end
end

Используйте whos функция, чтобы сравнить объем памяти, выделенный S1 и S2 в 64-битной системе. Даже при том, что S1 и S2 содержите те же данные, S1 использование значительно меньше памяти.

whos S1 S2
  Name        Size              Bytes  Class     Attributes

  S1          1x1              120504  struct              
  S2        100x50            1680192  struct              

Комплексные массивы

MATLAB использует представление хранения с чередованием комплексных чисел, где действительные и мнимые части хранятся вместе в непрерывном блоке памяти. Если вы делаете копию комплексного массива, и затем изменяете только действительную или мнимую часть массива, MATLAB создает массив, содержащий и действительные и мнимые части. Для получения дополнительной информации о представлении комплексных чисел в памяти, смотрите Поддержку MATLAB Чередованного Комплексного API в MEX-функциях.

Разреженные матрицы

Это - хорошая практика, чтобы сохранить матрицы немногими ненулевыми элементами с помощью разреженного устройства хранения данных. Когда полная матрица имеет небольшое количество ненулевых элементов, преобразование матрицы к разреженному устройству хранения данных обычно улучшает время использования памяти и выполнения кода. Можно преобразовать полную матрицу в разреженное устройство хранения данных с помощью sparse функция.

Например, позвольте матричному A будьте 1,000 1,000 полной единичной матрицей устройства хранения данных. Создайте B как разреженная копия A. В разреженном устройстве хранения данных те же данные используют значительно меньший объем памяти.

A = eye(1000);
B = sparse(A);
whos A B
  Name         Size                Bytes  Class     Attributes

  A         1000x1000            8000000  double              
  B         1000x1000              24008  double    sparse    

Работа с большими наборами данных

Когда вы работаете с большими наборами данных, неоднократно изменение размер массивов может заставить вашу программу исчерпывать память. Если вы расширяете массив вне доступной непрерывной памяти о его исходном местоположении, MATLAB должен сделать копию массива и переместить копию в блок памяти с достаточным пробелом. Во время этого процесса существует две копии исходного массива в памяти. Это временно удваивает объем памяти, требуемый для массива, и увеличивает риск вашей программы, исчерпывающей память. Можно улучшить время использования памяти и выполнения кода путем предварительного выделения максимальной суммы пробела, требуемого для массива. Для получения дополнительной информации смотрите Предварительное выделение.

Смотрите также

|

Похожие темы