Metatrader 5 - занимает много памяти при циклическом переходе по символам на графике - страница 4

 
Carl Schreiber:

Пробовали ли вы установить значениеTERMINAL_MAXBARSс помощью TerminalInfoInteger(...) на разумно малое значение?

Кроме того, у вас есть

TERMINAL_MEMORY_PHYSICAL

Физическая память в системе, Мб

int

TERMINAL_MEMORY_TOTAL

Память, доступная процессу терминала, Мб

int

TERMINAL_MEMORY_AVAILABLE

Свободная память процесса терминала, Мб

int

TERMINAL_MEMORY_USED

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

int


чтобы проверить, в чем суть дела.

Я установил TERMINAL_MAXBARS на 500 (очень мало), но он все равно загружает больше баров (предполагаю, что из файла?) и память все равно растет.

Я начал регистрировать счетчики памяти, перечисленные выше, и скоро получу результаты.

Ок, я получил некоторые данные, и они выглядят немного странно. Ниже приведены два журнала "MetaTrader Log" и "PowerShell Log" - это два журнала, которые я запускаю для регистрации использования памяти. (Сценарий PowerShell находится ранее в этой теме, я обновил его, чтобы он соответствовал тому, что находится в диспетчере задач). Оба этих журнала - это первый и последний раз, когда я выполнял последний запуск.

Точки интереса:

  1. TERMINAL_MEMORY_PHYSICAL и TERMINAL_MEMORY_TOTAL остаются неизменными. Эти значения идентичны в каждой строке на протяжении всего журнала.
  2. TERMINAL_MEMORY_AVAILABLE уменьшился с 13902 до 13806
  3. TERMINAL_MEMORY_USED увеличился с 432 до 528.
  4. Количество килобайт, используемых системой, увеличилось с 128 300 K (128.3 Mb) при запуске до 215 488 K (215.488 Mb) за время тестирования.

##### Журнал MetaTrader
##### Это было записано моим логгером в Metatrader. Он выводит всю память

ВРЕМЯ ТЕРМИНАЛЬНАЯ_ПАМЯТЬ_ФИЗИЧЕСКАЯ ТЕРМИНАЛЬНАЯ_ПАМЯТЬ_ВСЕГО ТЕРМИНАЛЬНАЯ_ПАМЯТЬ_ДОСТУПНА ТЕРМИНАЛЬНАЯ_ПАМЯТЬ_ИСПОЛЬЗОВАНА
2016.04.29 17:31:58 7167 14334 13902 432
2016.04.29 18:04:38 7167 14334 13806 528


#### Журнал PowerShell
#### Это было записано скриптом PowerShell.

04/29/2016 17:31:32 Кило байт в использовании 128 300 K
04/29/2016 18:05:08 Используемые килобайты 215 488 K

 
gr101:

Я установил TERMINAL_MAXBARS на 500 (очень низкое значение), но он все равно загружает больше баров (представляете, это из файла?), и память все еще растет.

Я начал регистрировать счетчики памяти, перечисленные выше, и скоро получу результаты.

Ок, я получил некоторые данные, и они выглядят немного странно. Ниже приведены два журнала "MetaTrader Log" и "PowerShell Log" - это два журнала, которые я запускаю для регистрации использования памяти. (Сценарий PowerShell находится ранее в этой теме, я обновил его, чтобы он соответствовал тому, что находится в диспетчере задач). Оба этих журнала - это первый и последний раз, когда я выполнял последний запуск.

Точки интереса:

  1. TERMINAL_MEMORY_PHYSICAL и TERMINAL_MEMORY_TOTAL остаются неизменными. Эти значения идентичны в каждой строке во всем журнале.
  2. TERMINAL_MEMORY_AVAILABLE уменьшился с 13902 до 13806
  3. TERMINAL_MEMORY_USED увеличился с 432 до 528.
  4. Количество килобайт, используемых системой, увеличилось с 128 300 K (128.3 Mb) при запуске до 215 488 K (215.488 Mb) за время тестирования.

##### Журнал MetaTrader
##### Это было записано моим логгером в Metatrader. Он выводит всю память

ВРЕМЯ ТЕРМИНАЛЬНАЯ_ПАМЯТЬ_ФИЗИЧЕСКАЯ ТЕРМИНАЛЬНАЯ_ПАМЯТЬ_ВСЕГО ТЕРМИНАЛЬНАЯ_ПАМЯТЬ_ДОСТУПНА ТЕРМИНАЛЬНАЯ_ПАМЯТЬ_ИСПОЛЬЗОВАНА
2016.04.29 17:31:58 7167 14334 13902 432
2016.04.29 18:04:38 7167 14334 13806 528


#### Журнал PowerShell
#### Это было записано скриптом PowerShell.

04/29/2016 17:31:32 Кило байт в использовании 128 300 K
04/29/2016 18:05:08 Используемые килобайты 215 488 K

У меня (ноутбук, 8GB ram, Win7-64) есть эквивалентное использование ram для каждого из моих 4 mt4.

Я думаю, что это не повод для беспокойства!

Сколько ГБ еще свободно/доступно?

 
Carl Schreiber:

Я (ноутбук, 8 ГБ ram, Win7-64) имею эквивалентное использование ram для каждого из моих 4 mt4.

Я думаю, вам не о чем беспокоиться!

Сколько ГБ еще свободно/доступно?

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

Поэтому примерно через час или два она начинает достигать максимума.

В настоящее время я запускаю советника на Server 2012, 7 ГБ ОЗУ, 4 ядра (не уверен, что они есть), 64 бит.

 
gr101:

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

Так что примерно через час или два она начинает достигать максимума.

В настоящее время я запускаю советника на Server 2012, 7 ГБ ОЗУ, 4 ядра (не уверен, что они есть), 64 бит.

Однажды я узнал, что это похоже на особенность Win-Server держать как можно больше в памяти.

Я регулярно перезапускал терминалы, но мне было бы любопытно, может ли это привести к сбою или нет!

 
Carl Schreiber:

Однажды я узнал, что это похоже на особенность Win-Server сохранять как можно больше в памяти.

Я регулярно перезапускал терминалы, но мне было бы интересно узнать, может ли это привести к сбою или нет!

Интересно... хотя, похоже, это как-то связано с загрузкой символов в и из Market Watch.

Терминал не падает, он просто начинает работать очень медленно, неприемлемо медленно.

 
gr101:

Интересно... хотя, похоже, это как-то связано с загрузкой символов в и из Market Watch.

Терминал не падает, он просто начинает работать очень медленно, неприемлемо медленно.

Как вы можете это проверить? Может быть, сервер не настроен как быстрая машина для графики, а только для быстрых математических вычислений и быстрых ответов на запросы в Интернете?
 

Это стандартная установка Server 2012. Однако моя теория заключается в том, что не имеет значения, как он настроен. Утечка памяти со временем всегда будет занимать все пространство на машине.

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

 

Просто чтобы внести свои 2 цента в эту тему.

Здесь есть много хороших идей по поводу утечки памяти и ее увеличения, но что касается темы и первопричины, то мои соображения таковы:

- в опубликованном исходном коде не проверяется несколько соответствующих возвратов функций, например, возврат SymbolSelect().

- циклы for/while, основанные на возврате функций, например SymbolsTotal(), могли бы иметь некоторое ограничение или защиту от возврата неправильного значения функции.

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

 

Я думаю, что Роджерио Фигурелли прав, если многие вызовы функций не возвращаются, выделенная память не будет освобождена.

Возможно, вы можете уменьшить размер стека, чтобы проверить, не вызывает ли он ошибку переполнения стека.

Стек

В каждой MQL4-программе для хранения локальных переменных функций, которые создаются автоматически, выделяется специальная область памяти, называемая стеком. Для всех функций выделяется один стек. Размер стека по умолчанию составляет 256 кб, управлять размером стека можно с помощью директивы компилятора #property stacksize.

Статические локальные переменные хранятся там же, где и другие статические и глобальные переменные - в специальной области памяти, которая существует отдельно от стека. Динамически создаваемые переменные также используют область памяти, отдельную от стека.

При каждом вызове функции место в стеке выделя ется для внутренних нестатических переменных. После выхода из функции память снова становится доступной для использования.

Если из первой функции вызывается вторая, то вторая функция занимает под свои переменные необходимый размер из оставшейся памяти стека. Таким образом, при использовании включенных функций память стека будет последовательно занимать каждая функция. Это может привести к нехватке памяти во время вызова одной из функций, такая ситуация называется переполнением стека.

Поэтому для больших локальных данных лучше использовать динамическую память - при входе в функцию выделять память, необходимую для локальных нужд, в системе (new, ArrayResize()), а при выходе из функции освобождать память (delete, ArrayFree()).

См. также

Типы данных, Инкапсуляция и расширяемость типов,Инициализация переменных, Область видимости и время жизни переменных, Создание и удаление объектов

Program Properties (#property) - Preprocessor - Language Basics - MQL4 Reference
Program Properties (#property) - Preprocessor - Language Basics - MQL4 Reference
  • docs.mql4.com
Program Properties (#property) - Preprocessor - Language Basics - MQL4 Reference
 

Хорошие замечания.

Попробую как-нибудь и отпишусь здесь о результатах.

Спасибо

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