2016-02-15 5 views
1

У меня есть сценарий Matlab с интенсивной памятью. Что меня озадачивает, так это если я запустил этот код, он пропустит память на самой первой итерации (из 46 ожидаемых). Утечка в конце концов станет настолько большим, что это потребует заставляя Matlab бросить:Отладка Matlab позволяет избежать утечки памяти

massive leak at the first iteration

Попытка найти точку утечки, я поставил точку останова на первой строке в цикле, но, как я ударил «Продолжить» выполнение выполнялось через первый цикл и снова останавливалось в точке останова и не вызывало утечки. Удаление точки останова и продолжение с этой точки вновь приводит к утечке. Использование точки останова для выполнения кода Один цикл в это время позволяет избежать утечки, и код не заканчивается без проблем (рис. 2).

no leak when debugging the same script

Теперь я хотел бы:

1) понимают ли из-за чего-то я представил, или это может быть Matlab конкретный вопрос эта утечка,

2) получаю идея о том, как найти утечку (я не могу использовать отладчик, поскольку он устраняет проблему).

Я хотел бы предоставить код, но это довольно большой фрагмент (> 100 строк), поэтому мой вопрос касается общего подхода, чем фактическая отладка конкретной проблемы.

+1

интересно, вы предварительно выделили свои матрицы перед циклом? Кроме того, что-либо в вашей петле становится больше с каждой итерацией? т. е. вектор, который растет с каждой итерацией по размеру? – GameOfThrows

+0

Я предопределяю то, что могу, за пределами основного цикла. Существует вложенный цикл, и я предварительно распределяю его до основного цикла. Поэтому я переписываю первую матрицу, переопределяя ее как нули в каждом цикле. EDIT: забыл ответить на второй вопрос. Нет, на самом деле ничего не растет. – Alvin

+0

, если на вашем ПК вы можете использовать функцию 'memory' и' whos', чтобы сделать какую-то старую печатную информацию на экране во время обычного (без отладки) исполнения, чтобы увидеть, можете ли вы «отладить» его. – matlabgui

ответ

0

Спасибо за предложения. Мой подход заключался в том, чтобы изолировать часть кода, которая вызывала проблему с распечатками над каждой строкой кода, так что перед аварийным сбоем я мог видеть, где выполнение прекращено. Виновником была линия zeros(100k), где я попытался выделить большую матрицу.

Я попытался выполнить ту же строку в более новой версии Matlab (2015b против 2014b) и обнаружил, что, в то время как более старая версия позволяет создавать экземпляры больших матриц (более ~ 50k на 50k) и зависает, когда она сосет всю память, новая версия возвращает следующую ошибку:

Error using zeros

Requested 50000x50000 (18.6GB) array exceeds maximum array size preference. Creation of arrays greater than this limit may take a long time and cause MATLAB to become unresponsive. See array size limit or preference panel for more information.

В моем случае пределы матрицы NxN являются:

N> ~ 60000 на Matlab2014b на 16 Гб оперативной памяти

N> = 46341 на Matlab2015b на 12GB ОЗУ

С той разницей, что моя версия 2014 позволяет мне хотя бы попытаться создать их и свернуть, когда они слишком большие, а версия 2015 года не позволяла мне вообще пытаться.

Недостатком является то, что в версии 2014b, если я отлаживаю код, компиляторы позволяют запустить линию zeros(100k), и все работает отлично. Проблема появляется снова, если я попытаюсь представить содержимое матрицы в Matlab Variables Tab.

+1

Очень часто случается, что отладчики позволяют делать то, что не будет выполняться во время выполнения - не только в MATLAB. Я вспоминаю известный случай с разработчиками Msoft Word, где они пытались найти ошибку при сбое, но в своем отладчике ограничение на открытые файлы было Inf, а не значение, назначенное для приложения Word во время выполнения. Взял их некоторое время :-), чтобы отследить это –

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