Сборщик "мусора" MATLAB?

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

28
задан Community 23 May 2017 в 12:31
поделиться

3 ответа

Это список фактов, которые я собрал. Вместо ГК термин выделения памяти (де) представляется более подходящим в этом контексте.

Моим основным источником информации является блог Лорен (особенно его комментарии) и эта статья из MATLAB Digest.

Из-за своей ориентации на численные вычисления с возможными большими наборами данных, MATLAB действительно хорошо справляется с оптимизацией производительности объектов стека , например, используя операции на месте над данными и вызов по ссылке для аргументов функции. Также из-за своей ориентации модель памяти принципиально отличается от таких ОО-языков, как Java.

У MATLAB официально не было пользовательской кучи памяти до версии 7 (в версии 6 была недокументированная функциональность reference в файлах schema.m). MATLAB 7 имеет кучу как в виде вложенных функций (замыканий), так и для обработки объектов , их реализация разделяет одни и те же основы. В качестве дополнительного примечания ОО можно было эмулировать с замыканиями в MATLAB (интересно до 2008a).

Удивительно, но можно исследовать всю рабочую область включающей функции, захваченной дескриптором функции (замыкание), см. Функцию functions (fhandle) в справке MATLAB. Это означает, что окружающее рабочее пространство замораживается в памяти. Вот почему cellfun/arrayfun иногда очень медленные, когда используются внутри вложенных функций.

Есть также интересные посты Лорен и Брэда Фелана по очистке объекта.

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

Проблемы производительности освобождения памяти MATLAB, которые могут поразить код, довольно плохие. Я всегда замечаю, что непреднамеренно представляю циклические ссылки в своем коде, когда он неожиданно работает в 20 раз медленнее и иногда требуется несколько секунд между выходом из функции и возвратом к вызывающей стороне (время, потраченное на очистку). Это известная проблема, см. В Дейве Фоти и в этом старом посте на форуме , какой код используется для визуализации производительности этой картины (тесты выполняются на разных машинах, поэтому сравнение абсолютной синхронизации разных Версии MATLAB не имеют смысла):

Линейное увеличение размера пула для объектов-ссылок означает полиномиальное (или экспоненциальное) снижение производительности MATLAB! Для объектов-значений производительность, как и ожидалось, является линейной.

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

РЕДАКТИРОВАТЬ : Я всегда сталкивался с проблемой производительности с многими маленькими вложенными функциями, но недавно я заметил, что по крайней мере с 2006a очистка одиночной вложенной области действия с некоторые мегабайты данных также ужасны, требуется всего 1,5 секунды, чтобы установить пустую переменную вложенной области видимости!

РЕДАКТИРОВАТЬ 2 : наконец я получил ответ - от самого Дейва Фоти . Он признает недостатки, но говорит, что MATLAB собирается сохранить свой нынешний подход к детерминированной очистке.

Легенда: более короткое время выполнения лучше

R2006a R2008a R2009a

44
ответ дан Amro 28 November 2019 в 03:00
поделиться

Похоже, вы пытаетесь построить какой-то аргумент Python против MATLAB. Меня не особо интересует этот аргумент.

Мета-ответ на ваш мета-вопрос.

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

Чем больше вы знаете о текущем механизме управления памятью, тем больше вероятность, что вы будете кодировать защитный код против этого конкретной реализации, тем более вероятно, что вы не получите выгоды от будущих улучшений производительности. Ряд хороших примеров этого можно найти в Java gc, грамотно написанном Брайаном Гетцем на сайте developerworks.com:

http: //www.ibm.com/developerworks/library/j-jtp01274.html

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

Я никогда не видел проекта, в котором требовалось бы использовать генерацию gc over mark sweep при подсчете ссылок. Не думаю, что скоро увижу.

опыт моих разработчиков и т. д.?

Я никогда не видел проекта, в котором требовалось бы использовать генерацию gc over mark sweep при подсчете ссылок. Не думаю, что скоро увижу.

опыт моих разработчиков и т. д.?

Я никогда не видел проекта, в котором требовалось бы использовать генерацию gc over mark sweep при подсчете ссылок. Не думаю, что скоро увижу.

2
ответ дан 28 November 2019 в 03:00
поделиться

MATLAB делает рабочее пространство очень понятным в браузере Workspace или с помощью "whos" "команда. Это показывает вам все объекты, созданные вашими командами, и сколько памяти они занимают.

feature('memstats')

покажет вам самый большой непрерывный блок памяти, доступный MATLAB, что означает, что это самая большая матрица, которую вы можете создать. Использование команды «очистить» синхронно удалит эти объекты из памяти и освободит место для повторного использования.

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

В нашем техническом примечании есть много информации об управлении памятью программ: http: // www.mathworks.com/support/tech-notes/1100/1106.html

И недавно я написал об обработке памяти Java в блоге MATLAB Desktop: http: //blogs.mathworks. com / desktop / 2009/08/17 / call-java-from-matlab-memory-issues /

Если вас академически интересует, что происходит с выделенной памятью при выходе из функции или при изменении размера переменной ... I Я почти уверен, что это коммерческая тайна, и она меняется с каждым выпуском. Вы никогда не должны этого замечать, и если вы столкнетесь с проблемами производительности, которые, как вы подозреваете, связаны с управлением объектами, отправьте запрос в службу технической поддержки: http://www.mathworks.com/support

13
ответ дан 28 November 2019 в 03:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: