Metatrader 5 - Consomme beaucoup de mémoire lorsqu'on fait défiler les symboles d'un graphique. - page 2

 
gr101:

Je l'ai mis sur Windows Server 12 R2 et cela augmente également la mémoire.

Je vais surveiller cela pendant un certain temps et donner un retour d'information sur ce fil.

Il est actuellement de 650 Mb

Je n'ai rien changé, je l'ai juste laissé tourner.

 
gr101:

Merci pour les commentaires.

Je pense que je vais passer à Windows 10 et voir si cela fait une différence.

Vous vous concentrez sur la boucle. Qu'utilisez-vous d'autre dans votre EA ? Des contrôles graphiques ou d'autres contrôles ?
 

Le script mentionné plus haut dans le fil de discussion est l'EA complet (ForumQuestion1.mq5), c'est ce qui fait monter la mémoire. Il n'y a pas d'autres actions dans l'EA.

Aucun contrôle graphique.

 

Bonjour Alain,

Veuillez consulter le document Word ci-joint. Il s'agit d'une instance de Windows Server 2012 R2 exécutée dans Windows Azure. C'est une nouvelle machine (donc pas de logiciel bizarre ou autre) et elle fonctionne dans le centre de données d'Europe occidentale.

L'augmentation de la mémoire d'utilisation au fil du temps se produit également ici lors de l'exécution du script ForumQuestion1.mq5 (de plus tôt dans le fil).

Voici une répartition de l'augmentation dans le temps, de 8 h 40 à 14 h 05, le volume est passé de 74,1 Mo à 379,9 Mo.

8:40 am

74.1 MB

Je viens de lancer ForumQuestion1 EA

9:53 am

281.6 MB

10h30 du matin

297.2 MB

11 h 23

319.3 MB

12 h 23

343.5 MB

13:00 pm

369.1 MB

14:05 PM

379.9 MB

Dossiers :
 
Je pense que c'est normal. Mon MT4 est sur 1GB ram maintenant.
 
Daniela Bluemel:
Je pense que c'est normal. Mon MT4 est sur 1GB ram maintenant.
Ce sujet concerne MT5 Daniela.
 
Alain Verleyen:
Ce sujet concerne MT5 Daniela.
Oui, je sais, mais mon MT4 a le même comportement.
 
J'ai trouvé un moyen de contourner le problème... ce n'est pas joli mais ça marche.

Solution : Exécutez un script PowerShell qui vérifie la mémoire. Lorsqu'elle dépasse 60%, il redémarre MetaTrader.

Le script est ci-dessous, je suis en train de le tester.

Etapes :

  1. Cliquez sur Démarrer sur Windows
  2. Tapez "PowerShell ISE".
  3. Coupez et collez le script ci-dessous dans l'éditeur de texte.
  4. Appuyez sur play (ou enregistrez le fichier PS1 et exécutez-le à partir de l'invite de commande, mais je suis toujours en train de le tester, donc je l'exécute à partir de PowerShell ISE pour le moment).

Le script ci-dessous redémarre Metatrader (terminal64) si la mémoire dépasse 300 Mo (selon la colonne de la mémoire dans votre gestionnaire de tâches) :

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

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
 

Avez-vous essayé de définirTERMINAL_MAXBARSavec TerminalInfoInteger(..) à une petite valeur raisonnable ?

En plus de cela, vous avez :

TERMINAL_MEMORY_PHYSICAL

Mémoire physique du système, en Mo

int

TERMINAL_MEMORY_TOTAL

Mémoire disponible pour le processus du terminal, Mb

int

MÉMOIRE_TERMINALE_DISPONIBLE

Mémoire libre du processus du terminal, en Mo

int

MÉMOIRE_TERMINAL_UTILISÉE

Mémoire utilisée par le terminal, en Mo

int


pour vérifier où se trouve le nœud du problème.

 

Mon avis est que vous ne libérez pas la mémoire avec les seuls "symboles de suppression".

Essayez ceci :

delete symbols;
symbols=NULL;