Использование памяти скриптами Lua

Страницы: 1
RSS
Использование памяти скриптами Lua
 
Интересен алгоритм использования памяти.
Ниже простой скрипт, который при каждом расчёте обращается к функции "getInfoParam". При запуске, в столбце "Память, КБ" = 41.04, и, с каждым новым расчётом, затраченная память увеличивается: 41.04, 41.07, 41.11...
Почему происходит увеличение используемой памяти, ведь данные не накапливаются?
Заметил, что в скриптах память увеличивается до определённого предела (примерно в 2 раза больше, чем при старте) затем сбрасывается до начального размера.
Возможно, где-то уже это обсуждалось, но не нашёл.
Код
function OnInit() -- Функция вызывается терминалом QUIK перед вызовом функции main().
   is_run = true
   return
end -- выход из функции: OnInit()
function main() -- Функция, реализующая основной поток выполнения в скрипте. Для ее выполнения терминал QUIK создает отдельный поток.
   while is_run do -- повторяющийся цикл, пока is_run = true
      ScriptTimeStart = getInfoParam("SERVERTIME") -- Время начала расчёта скрипта
      sleep(1000)
   end -- выход из цикла: повторяющийся цикл, пока is_run = true
   return
end -- выход из функции: main()
function OnStop() -- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления и при закрытии терминала QUIK.
   is_run = false
   return
end
 
Еще больший расход памяти будет если объявить локальную переменную и в нее записывать полученный результат. Память тратится как раз на хранение текущих и промежуточных данных.
Каждый раз получая данные с сервера, их надо хранить. В вашем примере переменная глобальная, но ее бы стоило инициализировать ранее, чтобы под нее была выделена память.

А сбрасывается память при автоматическом запуске garbage collector. При этом очищается "мусор", т.е. выделенная память под локальные переменные (неиспользуемые ключи таблиц и т.д.), которые уже не нужны.
Вы также можете вручную запустить collectgarbage, но разработчики не советуют это делать.
 
Спасибо за ответ.
Вот что у меня получилось.
1. Объявление локальной переменной не повлияло на затраты памяти.
2. Объявление переменной заранее не повлияло на затраты памяти.
3. Вызов штатной os.clock() не приводит к увеличению затраченной памяти.
Получается, что сделать максимально статичным использование памяти невозможно из-за её увеличения при повторном вызове штатных функций QLUA..
 
Сегодня выпустил своего простенького робота сеточника на демо-счёт. Пока трудится без капризов, но потребление памяти, с учётом, что робот практически не накапливает данные впечатляет. Мусоровоз приезжает систематически, но загружает не весь мусор.
 
Это безумно много. Если только Вы не храните в таблицах обезличенные сделки или некие расчеты на огромное число ключей.
Но даже с этим больше 50-100 мб. это явно где-то утечка.
Возможно часто получаются данные произвольных таблиц.

Я на > 8.5 версиях больше 70 мб. не получал. При 20 мб. я уже начинаю отлаживать и исправлять утечки памяти или оптимизировать код.
 
Цитата
Михаил Понамаренко написал:
Сегодня выпустил своего простенького робота сеточника на демо-счёт. Пока трудится без капризов, но потребление памяти, с учётом, что робот практически не накапливает данные впечатляет. Мусоровоз приезжает систематически, но загружает не весь мусор.
Если хотите решение проблемы, то выкладывайте скрипт.
Телепатов на форуме нет.
 
Основные пожиратели памяти - функции QUIK. Но могу ошибаться, т.к. только начал оптимизацию. Может, где-то и накапливаемый массив есть.
nikolz, обратите внимание на мой код в начале темы. При каждом вызове безобидной getInfoParam("SERVERTIME") приходится жертвовать 3 байта памяти. Вот этот момент меня больше всего интересует. В моём коде аналогичные вызовы, только в десятки или сотни раз больше.
 
Вчерашний тест, можно сказать, успешный: 54 тысячи заявок, 14 тысяч сделок, расчёт кода робота каждые 500мс, затраченной памяти 2Гб. Но главное - ни одного зависания. Всё очень быстро и точно (в сравнении с QPILE).
В реальной торговле в таком режиме использовать не собираюсь и затраты памяти будут не существенные. Поэтому вопрос не критичный, скорее для возможного улучшения работы.
Но это первый день краш-теста.
 
Цитата
Михаил Понамаренко написал:
Вчерашний тест, можно сказать, успешный: 54 тысячи заявок, 14 тысяч сделок, расчёт кода робота каждые 500мс, затраченной памяти 2Гб. Но главное - ни одного зависания. Всё очень быстро и точно (в сравнении с QPILE).
В реальной торговле в таком режиме использовать не собираюсь и затраты памяти будут не существенные. Поэтому вопрос не критичный, скорее для возможного улучшения работы.
Но это первый день краш-теста.
Очевидно, что у Вас неправильно написана программа.
Вы либо банально не даете работать сборщику либо плодите много мусорных объектов  как глобальные .
Для начала поставьте контроль занятой памяти и при размере больше заданного запускайте сборщик мусора.
 
Цитата
Михаил Понамаренко написал:
Сегодня выпустил своего простенького робота сеточника на демо-счёт. Пока трудится без капризов, но потребление памяти, с учётом, что робот практически не накапливает данные впечатляет. Мусоровоз приезжает систематически, но загружает не весь мусор.
У меня достаточно сложные роботы, висят круглосуточно постоянно (пока на версии 8.8.4.3 с 14 сентября), память показывается в данном окне 300-600 KB и в этих пределах крутится. У вас просто нереальные цифры.
 
Цитата
Александр М написал:
Цитата
Михаил Понамаренко написал:
Сегодня выпустил своего простенького робота сеточника на демо-счёт. Пока трудится без капризов, но потребление памяти, с учётом, что робот практически не накапливает данные впечатляет. Мусоровоз приезжает систематически, но загружает не весь мусор.
У меня достаточно сложные роботы, висят круглосуточно постоянно (пока на версии 8.8.4.3 с 14 сентября), память показывается в данном окне 300-600 KB и в этих пределах крутится. У вас просто нереальные цифры.
очевидно это у вас версия 7 на XP
у меня тоже 7 версия кушает 600 КB
а вот верия 8.3 на win10 даже без робота кушает 6.8МБ
 
Цитата
nikolz написал:
Цитата
Александр М написал:
 
Цитата
Михаил Понамаренко  написал:
Сегодня выпустил своего простенького робота сеточника на демо-счёт. Пока трудится без капризов, но потребление памяти, с учётом, что робот практически не накапливает данные впечатляет. Мусоровоз приезжает систематически, но загружает не весь мусор.
 У меня достаточно сложные роботы, висят круглосуточно постоянно (пока на версии 8.8.4.3 с 14 сентября), память показывается в данном окне 300-600 KB и в этих пределах крутится. У вас просто нереальные цифры.
очевидно это у вас версия 7 на XP
у меня тоже 7 версия кушает 600 КB
а вот верия 8.3 на win10 даже без робота кушает 6.8МБ
Вроде русским языком написано версия 8.8.4.3 на win10 и кушает столько, сколько я написал.
Страницы: 1
Читают тему (гостей: 1)
Наверх