Я новичок в MATLAB, это не было в описании работы, и я был вынужден взять на себя ответственность за человека, который написал и поддерживал код, который использует моя компания. Жизнь сложная.
Парень, из которого я берусь, сказал мне, что он объявил все большие векторы данных как global
, чтобы сохранить память. Более конкретно, так что, когда одна функция вызывает другую функцию, он не создает копию данных, когда он передает ее.
Это правда? Я читал Стратегии эффективного использования памяти, и он говорит, что
При работе с большими наборами данных следует помнить, что MATLAB создает временную копию входной переменной, если вызываемая функция изменяет ее значение. Это временно удваивает память, необходимую для хранения массива, что заставляет MATLAB генерировать ошибку, если достаточная память недоступна.
В нем говорится что-то очень похожее в Распределение памяти для массива Аргументы #Function:
Когда вы передаете переменную функции, вы фактически передаете ссылку на данные, которые представляет переменная. Пока входные данные не изменяются вызываемой функцией, переменная в вызывающей функции и переменная в вызываемой функции указывают на то же место в памяти. Если вызываемая функция изменяет значение входных данных, то MATLAB делает копию исходного массива в новом месте в памяти, обновляет, копирует с измененным значением, и указывает входную переменную в вызываемой функции на этот новый массив.
Так верно ли, что использование global
может быть лучше? Кажется немного небрежным, чтобы blithely объявить все большие данные как global
, вместо того, чтобы убедиться, что ни один из кодов не изменяет свой входной аргумент. Я ошибаюсь? Это действительно улучшает использование ОЗУ?