Утечка памяти

Простейшие вопросы в области инженерной разработки
Ответить
Аватара пользователя
jane_wild
master
master
Сообщения: 468
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 87 раз
Поблагодарили: 16 раз
Контактная информация:

Утечка памяти

Сообщение jane_wild »

Здравствуйте всем! Ковыряюсь в чужом проекте, достаточно большом (пара сотен VI) построенного с использованием Actor Framework. Сбор данных с использованием двух cDAQ. Заметила что при выпольнении программы использование памяти в диспетчере задач медленно, но верно увеличивается со временем. Подскажите есть ли какая либо методика нахождения этой самой утечки (проблемного VI)? Где искать в первую очередь? Спасибо.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3459
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 53 раза
Поблагодарили: 178 раз
Контактная информация:

Re: Утечка памяти

Сообщение Artem.spb »

jane_wild писал(а): 08 июл 2024, 22:37 Подскажите есть ли какая либо методика нахождения этой самой утечки (проблемного VI)? Где искать в первую очередь? Спасибо.
Прям инструмента я не нашёл, разве что профайлером смотреть.
А так, искать в незакрытых ссылках, ссылках на .NET, оставленных очередях и пр.
Если :labview: старая, то могут и массивы шалить (если их постоянно резать-сшивать). В последних версиях таких проблем не наблюдается.
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1372
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 59 раз
Контактная информация:

Re: Утечка памяти

Сообщение AndreyDmitriev »

jane_wild писал(а): 08 июл 2024, 22:37 Здравствуйте всем! Ковыряюсь в чужом проекте, достаточно большом (пара сотен VI) построенного с использованием Actor Framework. Сбор данных с использованием двух cDAQ. Заметила что при выпольнении программы использование памяти в диспетчере задач медленно, но верно увеличивается со временем. Подскажите есть ли какая либо методика нахождения этой самой утечки (проблемного VI)? Где искать в первую очередь? Спасибо.
Можно LabVIEW Desktop Execution Trace Toolkit попробовать заюзать.
https://www.ni.com/en/support/downloads ... tml#411212
Вот смотрите, допустим сделаем утечку в 4К в секунду (1024 элемента I32 добавляются в массив в цикле):
Изображение
Тулкит будет это показывать вот так:
Изображение
Причём Reference Leak он сам умеет отслеживать:
Изображение
Если я сделаю вот так:
Изображение
То после остановки тулкит покажет мне вот что:
Изображение
Где-то так.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2228
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 28 раз
Поблагодарили: 29 раз

Re: Утечка памяти

Сообщение Borjomy_1 »

Я сталкивался с проблемами фрагментации памяти. Когда, например, циклично к массиву добавляется элемент, потом массив обрезается. Но положить в старую область памяти LabVIEW уже не может, потому что это место выделено под более мелкие фрагменты. И тогда выделяется новая область памяти. И так по кругу.
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1372
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 59 раз
Контактная информация:

Re: Утечка памяти

Сообщение AndreyDmitriev »

Borjomy_1 писал(а): 09 июл 2024, 08:40 Я сталкивался с проблемами фрагментации памяти. Когда, например, циклично к массиву добавляется элемент, потом массив обрезается. Но положить в старую область памяти LabVIEW уже не может, потому что это место выделено под более мелкие фрагменты. И тогда выделяется новая область памяти. И так по кругу.
В современных реалиях это надо ну очень постараться что б такое спровоцировать, обычно лечится переездом на 64 бита с последующим добиванием памяти в комп. Я в своей практике налетел на эти грабли только один раз, там был массив кластеров с массивами строк, которые постоянно меняли длину, а так вообще менеджер памяти в LabVIEW достаточно разумен.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2228
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 28 раз
Поблагодарили: 29 раз

Re: Утечка памяти

Сообщение Borjomy_1 »

AndreyDmitriev писал(а): 09 июл 2024, 09:19 В современных реалиях это надо ну очень постараться что б такое спровоцировать, обычно лечится переездом на 64 бита с последующим добиванием памяти в комп. Я в своей практике налетел на эти грабли только один раз, там был массив кластеров с массивами строк, которые постоянно меняли длину, а так вообще менеджер памяти в LabVIEW достаточно разумен.
Вылезало в классах, содержащих большие объемы массивов кластеров. Из последнего - создание буферов видеокадров в Visio для последующей записи на диск. Также компонент Picture склонен к жору. Он старый и хранение информации в нем не растровое, а командное.

Резюме: жор памяти появляется тем, где циклически идет изменение размера больших массивов, особенно разнородных данных (кластер розового цвета). Рекомендуется разбивать массив кластеров на несколько массивов однородных данных и минимизировать число изменений размера данных, в том числе переходом на псевдоконстантные массивы.
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1372
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 59 раз
Контактная информация:

Re: Утечка памяти

Сообщение AndreyDmitriev »

Borjomy_1 писал(а): 09 июл 2024, 11:50
AndreyDmitriev писал(а): 09 июл 2024, 09:19 В современных реалиях это надо ну очень постараться что б такое спровоцировать, обычно лечится переездом на 64 бита с последующим добиванием памяти в комп. Я в своей практике налетел на эти грабли только один раз, там был массив кластеров с массивами строк, которые постоянно меняли длину, а так вообще менеджер памяти в LabVIEW достаточно разумен.
Вылезало в классах, содержащих большие объемы массивов кластеров. Из последнего - создание буферов видеокадров в Visio для последующей записи на диск.
Да, в Vision есть такое дело, там изображения намертво прибиваются в память (и выделение идён не менеджером LabVIEW а через запрос выделения выровненной памяти у Windows), так что если создать массив, заполняющий всю память, а потом удалить каждую вторую картинку, то останутся дырки, которые дадут сильную дефрагментацию, это так.
Аватара пользователя
jane_wild
master
master
Сообщения: 468
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 87 раз
Поблагодарили: 16 раз
Контактная информация:

Re: Утечка памяти

Сообщение jane_wild »

Спасибо за советы, буду искать. Вопрос по ссылкам. Если я Open VI Reference, то понятное дело что его нужно закрыть. А как в случае использования reference на индикаторы фронтальной панели? При инициализации программы читаются ссылки на индикаторы, которые потом используются для обновления данных. Вот их нужно закрывать? Дело в том что в проекте открываются/закрываются разные фронтальные панели со своими индикаторами.
Кстати в соседней теме меня очень заитересовала возможность обновления по индексу, за что отдельное спасибо. В следующем проекте попробую внедрить...
Artem.spb

Activity Автор
professor
professor
Сообщения: 3459
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 53 раза
Поблагодарили: 178 раз
Контактная информация:

Re: Утечка памяти

Сообщение Artem.spb »

jane_wild писал(а): 09 июл 2024, 16:38 А как в случае использования reference на индикаторы фронтальной панели?
NI говорит, что их можно не закрывать.
Ответить

Вернуться в «Для чайников»