Размер блока MATLAB и управление памятью - PullRequest
2 голосов
/ 27 января 2010

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

Код значительно ускоряется при использовании блоков большего размера. Но если я слишком большой, я получаю ошибку «Недостаточно памяти» В настоящее время я вручную настраиваю свой код, чтобы найти самый большой размер рабочего блока для данного ввода.

Мой вопрос : как мне автоматизировать процесс поиска максимально возможного размера блока?

Я играл с тем, чтобы обернуть все в блок try / catch и повторять циклы с постепенно уменьшающимися размерами блоков, пока это не удастся. Я надеюсь, что есть более элегантный или идиоматический способ.

1 Ответ

8 голосов
/ 27 января 2010

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

Вот простой пример. Я начну с очистки рабочего пространства и создания 2 больших матриц:

>> clear all
>> mat1 = zeros(8000);  %# An 8000-by-8000 matrix of doubles
>> mat2 = zeros(8000);  %# Another 8000-by-8000 matrix of doubles

Теперь, допустим, я знаю, что мне придется выделить N-by-N матрицу двойных чисел, для чего потребуется 8*N*N байтов памяти (8 байтов на двойную). Я могу сделать следующее, чтобы узнать, насколько большим я могу сделать N:

>> uV = memory  %# Get the memory statistics

uV = 

    MaxPossibleArrayBytes: 314990592
    MemAvailableAllArrays: 643969024
            MemUsedMATLAB: 1.2628e+009

>> maxN = floor(sqrt(uV.MaxPossibleArrayBytes/8))  %# Compute the maximum N

maxN =

        6274

>> mat3 = ones(maxN);    %# Works fine
>> mat3 = ones(maxN+1);  %# Tanks! Too large!
??? Out of memory. Type HELP MEMORY for your options.

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

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