Проблема с использованием памяти

Захват, обработка и генерирование сигнала
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Проблема с использованием памяти

Сообщение IvanLis »

Lancelot писал(а):IvanLis, а каким образом локализовать? Искусственно насоздавать подВП?
Выделение памяти происходит трижды: при чтении, при преобразовании и при выводе на индикатор (два последних хотелось бы объединить, но хз как).

Проблема не в том, чтобы просто уменьшить потребление памяти, а в том, чтобы вовремя ее освобождать. Я часто работаю с такими данными, которые приходится читать большими кусками, поэтому хотелось бы научиться контролировать аппетиты своих программ
Объединять не надо.
По идее, на следующей итерации цикла память выделенная для хранения исходных и промежуточных данных должна использоваться повторно (освобождаться).
Т.е. загрузка памяти будет, но на размер результатов, т.к. они накапливаются.
На каком то из участков кода происходит накопление, т.е. новые дописываются, а старые и ненужные не удаляются.

Я предлагал отследить именно эти участки и использовать сдвиговые регистры.
Я бы вообще советовал, при обработке больших объемов данных или времени-критичных задачах, использовать предварительное выделение памяти, т.к. использование автоиндексирования массивов никогда до хорошего не доводило.
На уже рассматривались подобные примеры.
Я бы в первую очередь избавился именно от автоиндексирования на всех этапах.
IORIK
adviser
adviser
Сообщения: 240
Зарегистрирован: 14 дек 2010, 20:46
Версия LabVIEW: 7.0; 8.2

Re: Проблема с использованием памяти

Сообщение IORIK »

С одной причиной я разобрался :1stplace:
Все дело в подпрограммах. Результат вполне ожидаемый, но грустный.
Резюм такой, в "тяжелых" программах не стоит весь код раскидывать по подпрограммам. Хотя, может я все таки ошибаюсь?
Еще, я не проверял как дело обстоит после компиляции приложения.
AndreyDmitriev

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

Re: Проблема с использованием памяти

Сообщение AndreyDmitriev »

IORIK писал(а):С одной причиной я разобрался :1stplace:
Все дело в подпрограммах. Результат вполне ожидаемый, но грустный.
Резюм такой, в "тяжелых" программах не стоит весь код раскидывать по подпрограммам. Хотя, может я все таки ошибаюсь?
Думается, что вы всё-таки ошибаетесь. Код можно и нужно раскидывать по подпрограммам.
Если начинаются утечки памяти после помещения кода в подпрограмму, то как правило это возникает из-за накапливания элементов в массивах, в локальных переменных, либо в сдвиговых регистрах. Если такое случилось, то имеет смысл откатиться к стабильно работающей версии и постепенно перемещать код в подпрограммы, непрерывно проверяя программу на предмет утечек. Затем проблему надо просто локализовать и разобраться в причинах утечек. Сложные структуры (типа массивов кластеров, содержащих другие массивы) могут вызвать "дефрагментацию" памяти, но это бывает очень редко. Если уж случилось, то имеет смысл выделять сразу всю необходимую память заранее и при модификации масивов пользоваться функцией замены элементов, а не добавления.
Вы видите как бы "внешнее" проявление ошибки, но до сути, похоже, пока не докопались
IORIK
adviser
adviser
Сообщения: 240
Зарегистрирован: 14 дек 2010, 20:46
Версия LabVIEW: 7.0; 8.2

Re: Проблема с использованием памяти

Сообщение IORIK »

AndreyDmitriev, правильные слова вы пишете.
Термин "тяжелая программа" я применил к программам, которые либо работают с большими массивами, либо считывают большой файл и также работают с большими массивами (это вроде как раз тема ТС).
Для считывания данных коллега Lancelot использует "Read Spreadsheet File.vi", многие эту функцию используют (в том числе и я) не задумываясь.
Решил я заняться тестами. Сделал прогу, которая создает текстовый файл:
fig1 - write data.jpg
Файл весит около 30 МВ.
fig5d.jpg
fig5d.jpg (9.03 КБ) 2729 просмотров
Читаю этот файл простейшей программой, используя "Read Spreadsheet File.vi"
fig2 - read data (Spreadsheet file).jpg
Следующий рисунок показывает размер памяти, занимаемый :labview: 8.2 до первого запуска программы (58112 кБ)
fig5b.jpg
А это после запуска программы (281268 кБ):
fig5c.jpg
Разница между пуском и остановкой программы составляет более 200 МБ, Хотя в идеале должно быть не больше 60 МБ.
Вот вам и фокус-покус.
А теперь заглянем в "profale/performance & memory"
fig6.jpg
Просуммировав первые 3 строчки мы получим наши 200 МБ с лишним.
Открыв саму функцию "Read Spreadsheet File.vi", мы увидим, что она как матрешка состоит из подпрограмм.
Отсюда мой тот самый "злополучный" вопрос: а так ли нужны подпрограммы, если они так сильно забирают память. И что в подобном случае делать?

P.S. Если немного головой подумать, то можно уменьшить до 4 раз размер памяти при чтении такого файла. А экспресс функции есть зло в чистом виде :D .
ESeid

Автор
advanced
advanced
Сообщения: 150
Зарегистрирован: 30 мар 2011, 22:41
Награды: 1
Версия LabVIEW: 8.2-2013
Контактная информация:

Re: Проблема с использованием памяти

Сообщение ESeid »

IORIK, при работе с "тяжелыми" файлами нужна предельная аккуратность. Я тоже был вынужден отказаться от Sub VI, т.к. на их "границах" - входах и выходах - автоматически создаются регистры, которые немедленно удваивают потребляемую память. Поэтому в таких случаях лучше уж самому собрать VI из элементарных функций и скомпилировать в dll - по-крайней мере, будешь понимать, чего ожидать.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Обработка сигнала»