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

 

Здравствуйте. Проблема присутствует в последнем билде 3211 и в более ранних. Если копировать историю по небольшому списку символов или на небольшую глубину, это не бросается в глаза, но если попытаться запросить историю по всем символам, которые даёт брокер (особенно, если это пром. сервер и символов много: акции / деривативы), и на всю глубину, терминал довольно быстро начинает съедать под 20 ГБ памяти, его приходится закрывать и продолжать копирование со следующих символов.

Для воспроизведения проблемы прикладываю скрипт, основа взята из примера в справке по функции CopyTicks, в скрипте для удобства я добавил переключение между CopyTicks и CopyTicksRange с переменной use_range (утечка есть в обеих функциях). Глубина для примера - с прошлого октября. Запускаю на билде 3211 терминала, скачанного с сайта metatrader5.com, сервер по умолчанию - MetaQuotes-Demo. Прикладываю лог 3 запусков скрипта, за каждый запуск обрабатывается по 104 символа, и скриншоты диспетчера задач ДО запуска скрипта, после первого и второго (суффиксы 0, 1 и 2 соответственно). Как видно, потребление за один запуск выросло с 357 до 1836 МБ, после второго - 2211. После третьего запуска потребление памяти почти не увеличивается. Если увеличить глубину запрашиваемой истории и заново запустить скрипт, потребление памяти вырастет. На пром. серверах с тысячами символов, как я уже сказал, потребление вырастает до таких размеров, что приходится загружать историю порциями по N символов и постоянно перегружать терминал.

Если вызывать copy_ticks_range из Питона, всё равно неконтролируемо растёт потребление памяти в терминале.

Документация по MQL5: Интеграция / MetaTrader для Python / copy_ticks_range
Документация по MQL5: Интеграция / MetaTrader для Python / copy_ticks_range
  • www.mql5.com
copy_ticks_range - MetaTrader для Python - Интеграция - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Файлы:
mt5_0.png  23 kb
mt5_1.png  21 kb
mt5_2.png  22 kb
20220217.log  52 kb
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 3180: Векторы и матрицы в MQL5 и повышение удобства работы

fxsaber, 2022.02.06 11:40

Что-то в последних билдах сделали с CopyTicksRange. Теперь при запросе больших интервалов CPU нагружается значительно меньше, но больше всего упала нагрузка на RAM - в несколько раз.

Раньше на некоторые операции не хватало свободных 10 гигов RAM. Теперь с огромным запасом. Спасибо!

 
xfo:

Прикладываю лог 3 запусков скрипта, за каждый запуск обрабатывается по 104 символа, и скриншоты диспетчера задач

Понятнее будет, если прикрепите лог, где после каждого CopyTicks показано потребление памяти через MQL.

Предполагаю, что тики некоторое время сидят в кеше на случай повторного обращения. Кеш раздувается.

 

fxsaber, а как в mql5 показать съеденную терминалом память без вызовов ОС?

Проблема с CopyTicks старая, раньше была очень похожа на простую утечку, но я тогда детально не проверял повторный запрос одной и той же истории, сейчас да, похоже на кэширование истории в память, правда, почему-то после 2-го запуска объём чуть подрос, как на скринах. Но в любом случае даже обновление истории по куче тикеров (несколько тысяч) за последнюю неделю с пром. сервера брокера съедает всю память, эта "фишка" мешает.

 
xfo #:

fxsaber, а как в mql5 показать съеденную терминалом память без вызовов ОС?

TERMINAL_MEMORY_USED.

 

Решил для точности копировать по 10 млн тиков, сколько есть. В первом шла догрузка с сервера, в следующих уже с диска, понятно. Логирую память в начале скрипта и на каждом шаге. На тех строчках, где скопировалось 0 тиков, а до этого - 10 млн тиков, память "проседает" где-то на 780 МБ - это накладные расходы на массив, хотя структура MqlTick должна занимать 60 байт на тик вроде бы, ну или 64. С каждым символом объём памяти растёт. Сжатые тики в tkc файлах занимают грубо 4.6 байта на тик. За весь прогон подгружается 729 млн тиков - это грубо 3300 МБ, если бы всё это кэшировалось в память. Второй прогон я запустил через 4.5 минуты после первого, строчка 108, видно, что часть памяти освободилась, но к концу 2-го, а тем более 3-го прогона память съедается всё больше и больше по сравнению с первым, возможно, и утечка есть какая, а средний пик был в районе 3800 МБ.

В общем, идеально картина вычислений не сходится, пока предположение такое, что в память из tkc разжимаются тики, также кэшируются сжатые тики, возможно, часть пережимается из-за несовпадения границ диапазонов (на что уходит CPU). Часть кэша, возможно, со временем освобождается, могут быть какие-то утечки. Но работать это всё мешает.

Как передать эту информацию тех. поддержке? Раньше был сервисдеск, теперь там шлют на форум, а какие темы читает поддержка?
Файлы:
 

Я извиняюсь за вопрос - НО нафига все это - зачем вам в терминале одновременно 729 М тиков (не в файле тиков или файлах)? Вы с ними чаго делаете?

Я как -то плохо представляю задачи  ML в MT5 или на столько масштабное мультивалютное тестирование.


Качать данные не раз в неделю, а раз в день или сессию не пробовали? или ежечасно?

Перегружать и запускать терминал автоматически?


Я даже представить себе боюсь - когда вы осознаете что брокеров может быть не один или всерьез займетесь арбитражом.  и 1000 инструментов начнется восприниматься как ясельная группа.

Упоротый юзер - страшный сон разработчика, мог ли он (разработчик) представить - что его программу будут использовать для жесткого DDos брокера (40-50Гб в час - это жестко, могут быть последствия со стороны брокера, и я так понимаю, вы этим не собираетесь ограничиваться).

"Фишка" - это у кого надо фишка, она для того и придумана, что бы не досить брокеров, и ускорять работу терминала.


Крамольные мысли от другого упоротого юзера:

а что если сменить счет в открытом терминале, тип сервера, брокера - кеш очищается? надо будет когда-нибудь проверить, если будет не лень или не забуду.

 
Denis Vasyutin #:

Я извиняюсь за вопрос - НО нафига все это - зачем вам в терминале одновременно 729 М тиков (не в файле тиков или файлах)? Вы с ними чаго делаете?

Именно что в файлах истории мне они и нужны, а не в памяти, куда их накапливает терминал, причём все сразу. Какой ещё ДдОС брокера? История, во-первых, сохраняется в файлах tkc, посмотрите в логах скорость первого и второго запусков. А память засоряется даже если просто из файлов tkc запрашиваешь тики, например, в Питон, и хочешь сохранить в свой формат. Формат tkc закрытый. Извращаться и автоматически закрывать/открывать терминал - плохая затея. И раньше, кстати, не было функции CopyTicksRange с чётким ограничением по датам, и раньше память засорялась куда быстрее. А 1000 инструментов легко - одна серия опционов по паре акций. А акций много.

Причина обращения: