2016-06-23 7 views
2

Я запускаю программу ассимиляции данных в реальном времени, написанную в Matlab, и, похоже, происходит медленная утечка памяти. В течение примерно 16 дней среднее использование памяти увеличилось примерно на 40% (см. Рисунок ниже) примерно с 1,1 ГБ до 1,5 ГБ. Программа пеет каждые 15 минут, а пик в использовании памяти составляет около 30 секунд на этапе ассимиляции данных (см. Рисунок).Утечка памяти процессора Matlab за 16 дней

Blue: Matlab process memory usage measured once a second over the course of 16 days. Red: Linear trend in memory usage over time

В конце каждого 15-минутного цикла, я экономлю имена, размеры и типы всех переменных в текущем активном рабочем пространстве в файл .mat с помощью функции whos. Есть только более 100 переменных, и после запуска кода в течение примерно 16 дней нет четкой тенденции в объеме памяти, используемой любой из переменных.

Некоторые переменные очищаются в конце каждого цикла, но некоторые из них не являются. Я также звоню close all, чтобы убедиться, что в памяти нет цифр, и я убедился, что когда я пишу ASCII-файлы, я всегда fclose(fileID) файл.

Я в тупик ... Мне интересно, есть ли у кого-нибудь какие-либо предложения о том, что я должен искать, или инструменты, которые могли бы помочь выявить проблему. Заранее спасибо!

Редактировать, информацию о системе: RHEL 6.8 Matlab R2014b

+1

Вы открываете и закрываете цифры в своем действительном коде?Я бы предложил повторно использовать существующие цифры (или, возможно, хотя бы тестирование без них). Результирующий код может быть быстрее, и я вспоминаю, что в прошлом это был источник проблем с памятью. – horchler

+1

Кроме того, вы пробовали использовать профилирование (недокументированное профилирование памяти) Matlab (http://undocumentedmatlab.com/blog/undocumented-profiler-options)? – horchler

+0

Вы пишете «чистый» матлаб? Или вы получаете доступ к файлам mex, библиотекам C или java-объектам из вашей установки Matlab. – John

ответ

3

я понял проблему. Оказывается, ручки фигуры были скрыты, а close('all') работает только на фигурах, которые видны. Я предполагаю, что они скрыты, потому что цифры создаются за пределами того места, где я пытался закрыть фигуры. Решение заключалось в том, чтобы заменить close('all') на close all hidden, который закрывает все фигуры, включая скрытые ручки.

Я пойду вперед и вновь заявить, что @John и @horchler упомянул в своих комментариях, в случае их предложения могут помочь людям с подобными проблемами:

  • Повторное использование существующих фигур может повысить производительность и уменьшить потенциал для утечек памяти.

  • Matlab имеет undocumented memory profiler, который может помочь отладить проблемы, связанные с производительностью.

  • Для процессов, которые работают неограниченно долго, целесообразно отделить сбор данных/обработку и создание продуктов (рисунки и т. Д.). Первый считывает и обрабатывает данные и сохраняет их в БД или файл. Второй позволяет вам «просматривать/получать/запрашивать» данные.

  • Если вы вызываете скомпилированные функции mex в свой код, утечка памяти может происходить из кода Fortran или C/C++. Не очистка одной переменной может вызвать утечку и объяснит рост линейной памяти.

  • Функция Matlab whos отлично подходит для просмотра размера в памяти каждой переменной в рабочей области. Это может быть полезно для отслеживания того, какая переменная является виновником утечки памяти.

Thanks @John and @horchler!

Смежные вопросы