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

 
gr101:

Я поставил его на Windows Server 12 R2, и это также увеличивает память.

Позвольте мне понаблюдать за этим некоторое время и оставить отзыв в этой теме.

В настоящее время это 650 Мб.

Я ничего не менял, просто продолжаю работать.

 
gr101:

Спасибо за обратную связь.

Думаю, я обновлю Windows 10 и посмотрю, изменит ли это ситуацию.

Вы сосредоточены на контуре. Что еще вы используете в своем советнике? Графические элементы управления или какие-либо другие элементы управления?
 

Скрипт, приведенный ранее в этой теме, является полным советником (ForumQuestion1.mq5), именно он толкает память вверх. В советнике нет никаких других действий.

Нет графических элементов управления.

 

Здравствуйте, Алена,

Пожалуйста, посмотрите прикрепленный документ в формате word. Это экземпляр Windows Server 2012 R2, работающий в Windows Azure. Это новая машина (поэтому на ней нет забавного программного обеспечения или чего-либо еще), и она работает в центре обработки данных в Западной Европе.

Увеличение памяти использования со временем также происходит здесь при запуске скрипта ForumQuestion1.mq5 (из предыдущей темы).

Вот разбивка увеличения по времени с 8:40 утра до 14:05 вечера - с 74,1 МБ до 379,9 МБ.

8:40 утра

74.1 МБ

Только что запущен советник ForumQuestion1

9:53 утра

281.6 MB

10:30 утра

297.2 MB

11:23

319.3 MB

12:23 вечера

343.5 MB

13:00 вечера

369.1 MB

14:05 PM

379.9 MB

Файлы:
 
Я думаю, это нормально. Мой MT4 сейчас работает на 1 ГБ оперативной памяти.
 
Daniela Bluemel:
Я думаю, что это нормально. Мой MT4 сейчас работает на 1 ГБ оперативной памяти.
Эта тема посвящена MT5 Даниэле.
 
Alain Verleyen:
Эта тема касается MT5 Daniela.
Да, я знаю, но мой MT4 имеет такое же поведение
 
Нашел обходной путь... он не очень красивый, но работает.

Решение: Запустите сценарий PowerShell, который проверяет память. Когда она становится больше 60%, он перезапускает MetaTrader.

Скрипт приведен ниже, я занят его тестированием.

Шаги:

  1. Нажмите "Пуск" в Windows
  2. Введите "PowerShell ISE"
  3. Вырежьте и вставьте приведенный ниже скрипт в текстовый редактор
  4. Нажмите play (или сохраните как PS1 файл и запустите его из командной строки, но я все еще тестирую его, поэтому пока запускаю его из PowerShell ISE).

Скрипт ниже перезапускает Metatrader (terminal64), если память превышает 300 МБ (в соответствии с колонкой памяти в диспетчере задач):

#################################################################

strict-mode 
cls
$memoryThresholdInKiloBytes = 300000
$cooldownSeconds = 30
$loopPauseInSeconds = 30
$counter = 0

while($true){
    if($counter -gt 1000){
        cls
    }
    
    #write-host "$(get-date) Checking memory in use... counter=$counter"
    $processPrivateSet = Get-Counter "\Process(terminal64)\Working Set - Private"
    $wsPrivateKiloBytes = $processPrivateSet.CounterSamples[0].CookedValue / 1KB
   
    $memoryLabel = $wsPrivateKiloBytes.ToString('## ### ###') + " K"

    write-host "$(get-date) Kilo Bytes in use $memoryLabel"
    if($wsPrivateKiloBytes -gt $memoryThresholdInKiloBytes){
            
        write-host "$(get-date) Over threshold of $memoryLabel closing metatrader"
        
        # Close metatrader (terminal64)
        Get-Process terminal64 | Foreach-Object { 
            $_.CloseMainWindow() | Out-Null 
        } | stop-process –force
        
        # Give time to shutdown        
        write-host "$(get-date) Shutting down cooldown of $cooldownSeconds seconds #####################"
        start-sleep -Seconds $cooldownSeconds

        # Open metatrader
        write-host "$(get-date) Opening metatrader again and wait $cooldownSeconds seconds"
        &"C:\Program Files\MetaTrader 5\terminal64.exe"     
        start-sleep $cooldownSeconds
    }

    start-sleep -Seconds $loopPauseInSeconds
    $counter = $counter + 1;
}

# Links
# http://stackoverflow.com/questions/33344611/get-memory-private-working-set-of-process
 

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

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

TERMINAL_MEMORY_PHYSICAL

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

int

TERMINAL_MEMORY_TOTAL

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

int

TERMINAL_MEMORY_AVAILABLE

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

int

TERMINAL_MEMORY_USED

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

int


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

 

Мои 2 копейки заключаются в том, что вы не освобождаете память только с помощью "удаления символов".

Попробуйте это:

delete symbols;
symbols=NULL;