Управление памятью
-
- beginner
- Сообщения: 49
- Зарегистрирован: 01 авг 2014, 11:45
- Версия LabVIEW: 2013
- Контактная информация:
Управление памятью
Здравствуйте. Освобождает ли лабвью память после закрытия виртуального прибора vi? Если нет, то как его заставить это делать? Спасибо.
-
- beginner
- Сообщения: 49
- Зарегистрирован: 13 апр 2014, 18:53
- Версия LabVIEW: 14
- Контактная информация:
Re: Управление памятью
Я задавал такой вопрос в техподдержку и на курсах тоже говорят, что для того чтобы VI освобождали память, не нужно останавливать их кнопкой "Abort", а лучше корректно остановить все циклы (послать соответствующий сигнал на терминал Loop Condition), закрыть все сеансы связи, "убить" программно все открытые очереди (Queue), RTFIFO,..... и т.п.max69s писал(а):Здравствуйте. Освобождает ли лабвью память после закрытия виртуального прибора vi? Если нет, то как его заставить это делать? Спасибо.
А иначе есть вероятность, что каждый запуск программы будет "отгрызать" от памяти соответствующий кусочек и не освобождать его после аварийной остановки.
Последний раз редактировалось Shurik_85 01 ноя 2016, 15:17, всего редактировалось 1 раз.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Управление памятью
Освобождает. А зачем вам это?Здравствуйте. Освобождает ли лабвью память после закрытия виртуального прибора vi? Если нет, то как его заставить это делать? Спасибо.
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Управление памятью
Вдополнение вышесказенному: освобождает, но могут быть утечки.
Есть ещё Request Deallocation Function, но я в своё время не зметил особой пользы от неё.
а тут у нас было обсуждение проблем утечек
Есть ещё Request Deallocation Function, но я в своё время не зметил особой пользы от неё.
а тут у нас было обсуждение проблем утечек
-
- beginner
- Сообщения: 49
- Зарегистрирован: 01 авг 2014, 11:45
- Версия LabVIEW: 2013
- Контактная информация:
Re: Управление памятью
Спасибо за ответы.
А нужно это затем, что у меня в системе емеется модуль c#, который генерирует массив целых чисел. Далее эти данные передаются для обработки по цепочке виртуальных приборов.
Каждая генерация данных занимает около 1 гб. В итоге на 3-5 генерации вылетает ошибка OutOfMemory, тк выделенный стек в 4гб переполнен (lv 32 бит).
Если отключить цепочку обработки и оставить только инициализацию модуля c#, вызов функций генерации данных и очистку памяти (через методы этого модуля), то все работает как часы. Это видно и по динамике изменения занимаемого объема памяти в Диспетчере задач.
Если бы обработка в каком-то из vi не была завершена корректно, тогда скрашится вся система.
Такое ощущение, что при передаче одного и того же массива из vi в vi labview передаёт не указатель на область памяти, а копирует массив, и после загрузки его в следующем vi. В итоге с каждой генерацией по чуть-чуть накапливается потреблемая память.
Более того, если закрыть проект и оставить только стартовое окно со списком недавно использовавшихся проектов, то так не освободит ресурсы и процесс продолжается занимать около 3гб озу. Приходится полностью перезапускать процесс.
А нужно это затем, что у меня в системе емеется модуль c#, который генерирует массив целых чисел. Далее эти данные передаются для обработки по цепочке виртуальных приборов.
Каждая генерация данных занимает около 1 гб. В итоге на 3-5 генерации вылетает ошибка OutOfMemory, тк выделенный стек в 4гб переполнен (lv 32 бит).
Если отключить цепочку обработки и оставить только инициализацию модуля c#, вызов функций генерации данных и очистку памяти (через методы этого модуля), то все работает как часы. Это видно и по динамике изменения занимаемого объема памяти в Диспетчере задач.
Если бы обработка в каком-то из vi не была завершена корректно, тогда скрашится вся система.
Такое ощущение, что при передаче одного и того же массива из vi в vi labview передаёт не указатель на область памяти, а копирует массив, и после загрузки его в следующем vi. В итоге с каждой генерацией по чуть-чуть накапливается потреблемая память.
Более того, если закрыть проект и оставить только стартовое окно со списком недавно использовавшихся проектов, то так не освободит ресурсы и процесс продолжается занимать около 3гб озу. Приходится полностью перезапускать процесс.
-
- beginner
- Сообщения: 26
- Зарегистрирован: 23 авг 2016, 09:16
- Версия LabVIEW: 2016
- Контактная информация:
Re: Управление памятью
max69s, почитайте встроенную справку по палитре Memory Control Functions. Там есть инструменты для работы с данными по указателю, посмотрите примеры. А также про In Place Element Structure.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Управление памятью
Смотря как вы работаете с этой памятью в ваших библиотеках. Не видя кода сложно что либо сказать. Код в студию!max69s писал(а):Такое ощущение, что при передаче одного и того же массива из vi в vi labview передаёт не указатель на область памяти, а копирует массив, и после загрузки его в следующем vi. В итоге с каждой генерацией по чуть-чуть накапливается потреблемая память.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Управление памятью
Вероятнее всего, чтобы такая ситуация не возникала, необходимо выделять память (в которой C# функция возвращает данные) в вызывающей . Т.е на вход CLFN подается заданного размера массив. В таком случае выделенная память будет освобождена сборщиком