Могу ли я удалить переменные-заполнители, чтобы сохранить память в Matlab? - PullRequest
3 голосов
/ 10 июля 2019

Еще вопрос о голубом небе - если у меня есть какой-то код, подобный

A = [1,2,3,4,5,6]; %input data

B = sort(A); %step one

C = B(1,1) + 10; %step two

Есть ли строка кода, которую я могу использовать, чтобы удалить «B», чтобы сохранить память, прежде чем делать что-то еще сC

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Нет необходимости присваивать каждый результат новой переменной.Например, вы можете написать:

A = [1,2,3,4,5,6]; %input data
A = sort(A); %step one
A = A(1,1) + 10; %step two

Особенно, если A велико, гораздо эффективнее написать A = sort(A), чем B = sort(A), потому что тогда sort может работать в-place , избегая необходимости создавать вторичный массив.То же самое верно для многих других функций.Работа на месте означает, что кэш может использоваться более эффективно, ускоряя операции.Сокращение использования памяти также является плюсом для очень больших массивов, а операции на месте имеют тенденцию избегать фрагментации памяти.

Напротив, такие вещи, как clear B, имеют тенденцию замедлять работу интерпретатора, поскольку они делают вещи болеесложный для JIT.Кроме того, как видно из документации ,

В системах UNIX® очистка не влияет на объем памяти, выделенный процессу MATLAB.

То есть переменная очищается из памяти, но сама память не возвращается в систему.


В качестве отступления, как сказал @ obchardon в комментарии Ваш код может быть еще более упрощен, если вы поймете, что min делает то же самое, что и сохраняет только первое значение результата sort (но гораздо эффективнее).


В качестве примера:Я поместил три операции в ряд, которые могут работать на месте, и использовал timeit, чтобы рассчитать время выполнения этих двух опций: каждый раз использовать другую переменную и очищать их, когда в них больше нет необходимости.или присвоение одной и той же переменной.

N = 1000;
A = rand(1,N);
disp(timeit(@()method1(A)))
disp(timeit(@()method2(A)))

function D = method1(A)
B = sort(A);
clear A
C = cumsum(B);
clear B
D = cumprod(C);
end

function A = method2(A)
A = sort(A);
A = cumsum(A);
A = cumprod(A);
end

Использование MATLAB Online Я вижу следующие значения:

  • разные переменные + clear: 5.8806e-05 с
  • повторное использование той же переменной: 4.4185e-05 с

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

1 голос
/ 10 июля 2019
clear B

Это удалит переменную B из памяти. См. Документацию здесь для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...