Metatrader 5 - занимает много памяти при циклическом переходе по символам на графике - страница 4
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Пробовали ли вы установить значение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 находится ранее в этой теме, я обновил его, чтобы он соответствовал тому, что находится в диспетчере задач). Оба этих журнала - это первый и последний раз, когда я выполнял последний запуск.
Точки интереса:
##### Журнал MetaTrader
##### Это было записано моим логгером в Metatrader. Он выводит всю память
#### Журнал PowerShell
#### Это было записано скриптом PowerShell.
04/29/2016 17:31:32 Кило байт в использовании 128 300 K
04/29/2016 18:05:08 Используемые килобайты 215 488 K
Я установил TERMINAL_MAXBARS на 500 (очень низкое значение), но он все равно загружает больше баров (представляете, это из файла?), и память все еще растет.
Я начал регистрировать счетчики памяти, перечисленные выше, и скоро получу результаты.
Ок, я получил некоторые данные, и они выглядят немного странно. Ниже приведены два журнала "MetaTrader Log" и "PowerShell Log" - это два журнала, которые я запускаю для регистрации использования памяти. (Сценарий PowerShell находится ранее в этой теме, я обновил его, чтобы он соответствовал тому, что находится в диспетчере задач). Оба этих журнала - это первый и последний раз, когда я выполнял последний запуск.
Точки интереса:
##### Журнал MetaTrader
##### Это было записано моим логгером в Metatrader. Он выводит всю память
#### Журнал 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.
Я думаю, что это не повод для беспокойства!
Сколько ГБ еще свободно/доступно?
Я (ноутбук, 8 ГБ ram, Win7-64) имею эквивалентное использование ram для каждого из моих 4 mt4.
Я думаю, вам не о чем беспокоиться!
Сколько ГБ еще свободно/доступно?
У меня много оперативной памяти на уровнях, указанных выше на графиках. Проблема в том, что когда я оставляю его запущенным, он медленно увеличивает использование оперативной памяти.
Поэтому примерно через час или два она начинает достигать максимума.
В настоящее время я запускаю советника на Server 2012, 7 ГБ ОЗУ, 4 ядра (не уверен, что они есть), 64 бит.
У меня много оперативной памяти на уровнях, указанных выше на графиках. Проблема в том, что когда я оставляю его запущенным, он медленно увеличивает использование оперативной памяти.
Так что примерно через час или два она начинает достигать максимума.
В настоящее время я запускаю советника на Server 2012, 7 ГБ ОЗУ, 4 ядра (не уверен, что они есть), 64 бит.
Однажды я узнал, что это похоже на особенность Win-Server держать как можно больше в памяти.
Я регулярно перезапускал терминалы, но мне было бы любопытно, может ли это привести к сбою или нет!
Однажды я узнал, что это похоже на особенность Win-Server сохранять как можно больше в памяти.
Я регулярно перезапускал терминалы, но мне было бы интересно узнать, может ли это привести к сбою или нет!
Интересно... хотя, похоже, это как-то связано с загрузкой символов в и из Market Watch.
Терминал не падает, он просто начинает работать очень медленно, неприемлемо медленно.
Интересно... хотя, похоже, это как-то связано с загрузкой символов в и из Market Watch.
Терминал не падает, он просто начинает работать очень медленно, неприемлемо медленно.
Это стандартная установка Server 2012. Однако моя теория заключается в том, что не имеет значения, как он настроен. Утечка памяти со временем всегда будет занимать все пространство на машине.
Поэтому не имеет значения, насколько быстрой или сколько оперативной памяти у машины, если у нее есть утечка, то в какой-то момент она достигнет предела.
Просто чтобы внести свои 2 цента в эту тему.
Здесь есть много хороших идей по поводу утечки памяти и ее увеличения, но что касается темы и первопричины, то мои соображения таковы:
- в опубликованном исходном коде не проверяется несколько соответствующих возвратов функций, например, возврат SymbolSelect().
- циклы for/while, основанные на возврате функций, например SymbolsTotal(), могли бы иметь некоторое ограничение или защиту от возврата неправильного значения функции.
После изменения кода и повторного тестирования, возможно, мы сможем найти и устранить первопричину проблемы.
Я думаю, что Роджерио Фигурелли прав, если многие вызовы функций не возвращаются, выделенная память не будет освобождена.
Возможно, вы можете уменьшить размер стека, чтобы проверить, не вызывает ли он ошибку переполнения стека.
Стек
В каждой MQL4-программе для хранения локальных переменных функций, которые создаются автоматически, выделяется специальная область памяти, называемая стеком. Для всех функций выделяется один стек. Размер стека по умолчанию составляет 256 кб, управлять размером стека можно с помощью директивы компилятора #property stacksize.
Статические локальные переменные хранятся там же, где и другие статические и глобальные переменные - в специальной области памяти, которая существует отдельно от стека. Динамически создаваемые переменные также используют область памяти, отдельную от стека.
При каждом вызове функции место в стеке выделя ется для внутренних нестатических переменных. После выхода из функции память снова становится доступной для использования.
Если из первой функции вызывается вторая, то вторая функция занимает под свои переменные необходимый размер из оставшейся памяти стека. Таким образом, при использовании включенных функций память стека будет последовательно занимать каждая функция. Это может привести к нехватке памяти во время вызова одной из функций, такая ситуация называется переполнением стека.
Поэтому для больших локальных данных лучше использовать динамическую память - при входе в функцию выделять память, необходимую для локальных нужд, в системе (new, ArrayResize()), а при выходе из функции освобождать память (delete, ArrayFree()).
См. также
Типы данных, Инкапсуляция и расширяемость типов,Инициализация переменных, Область видимости и время жизни переменных, Создание и удаление объектов
Хорошие замечания.
Попробую как-нибудь и отпишусь здесь о результатах.
Спасибо