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

 
Carl Schreiber:

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, Mb

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.

J'ai fixé TERMINAL_MAXBARS à 500 (très bas) mais il charge toujours plus de barres (j'imagine que c'est à partir d'un fichier ?) et la mémoire continue à augmenter.

J'ai commencé à enregistrer les compteurs de mémoire énumérés ci-dessus et j'aurai bientôt un retour d'information à ce sujet.

Ok, j'ai eu quelques retours et cela semble un peu étrange. Voici deux journaux : "MetaTrader Log" et "PowerShell Log". Ce sont deux journaux que j'exécute et qui enregistrent l'utilisation de la mémoire. (Le script PowerShell se trouve plus haut dans ce fil de discussion, je l'ai mis à jour pour qu'il corresponde à ce qui se trouve dans le gestionnaire de tâches). Ces deux journaux sont la première et la dernière fois que j'ai effectué la dernière exécution.

Points d'intérêt :

  1. Les valeurs TERMINAL_MEMORY_PHYSICAL et TERMINAL_MEMORY_TOTAL restent les mêmes. Ces valeurs sont identiques dans chaque ligne tout au long du journal.
  2. Le TERMINAL_MEMORY_AVAILABLE est passé de 13902 à 13806.
  3. Le TERMINAL_MEMORY_USED a augmenté de 432 à 528.
  4. Le nombre de Kilo Octets utilisés par le système est passé de 128 300 K (128.3 Mb) au démarrage à 215 488 K (215.488 Mb) pendant la durée du test.

##### Journal de MetaTrader
##### Ceci a été enregistré par mon logger dans Metatrader. Il affiche toute la mémoire

TEMPS TERMINAL_MEMORY_PHYSICAL TERMINAL_MEMORY_TOTAL MÉMOIRE_TERMINALE_DISPONIBLE MÉMOIRE_TERMINALE_UTILISÉE
2016.04.29 17:31:58 7167 14334 13902 432
2016.04.29 18:04:38 7167 14334 13806 528


#### Journal PowerShell
#### Ceci a été enregistré par le script PowerShell

29/04/2016 17:31:32 Kilo octets utilisés 128 300 K
29/04/2016 18:05:08 Kilo-octets utilisés 215 488 K

 
gr101:

J'ai réglé le TERMINAL_MAXBARS à 500 (très bas) mais il charge toujours plus de barres (j'imagine que c'est à partir du fichier ?) et la mémoire continue à augmenter.

J'ai commencé à enregistrer les compteurs de mémoire énumérés ci-dessus et j'aurai bientôt un retour d'information à ce sujet.

J'ai reçu quelques informations et cela semble un peu étrange. Voici deux journaux : "MetaTrader Log" et "PowerShell Log". Ce sont deux journaux que j'exécute et qui enregistrent l'utilisation de la mémoire. (Le script PowerShell se trouve plus haut dans ce fil de discussion, je l'ai mis à jour pour qu'il corresponde à ce qui se trouve dans le gestionnaire de tâches). Ces deux journaux sont la première et la dernière fois que j'ai effectué la dernière exécution.

Points d'intérêt :

  1. Les valeurs TERMINAL_MEMORY_PHYSICAL et TERMINAL_MEMORY_TOTAL restent les mêmes. Ces valeurs sont identiques dans chaque ligne tout au long du journal.
  2. Le TERMINAL_MEMORY_AVAILABLE est passé de 13902 à 13806.
  3. Le TERMINAL_MEMORY_USED a augmenté de 432 à 528.
  4. Le nombre de Kilo Octets utilisés par le système est passé de 128 300 K (128.3 Mb) au démarrage à 215 488 K (215.488 Mb) pendant la durée du test.

##### Journal de MetaTrader
##### Ceci a été enregistré par mon logger dans Metatrader. Il affiche toute la mémoire

TEMPS TERMINAL_MEMORY_PHYSICAL TERMINAL_MEMORY_TOTAL MÉMOIRE_TERMINALE_DISPONIBLE MÉMOIRE_TERMINALE_UTILISÉE
2016.04.29 17:31:58 7167 14334 13902 432
2016.04.29 18:04:38 7167 14334 13806 528


#### Journal PowerShell
#### Ceci a été enregistré par le script PowerShell

29/04/2016 17:31:32 Kilo octets utilisés 128 300 K
29/04/2016 18:05:08 Kilo-octets utilisés 215 488 K

J'ai (ordinateur portable, 8 Go de ram, Win7-64) une utilisation équivalente de la ram pour chacun de mes 4 mt4.

Je pense qu'il n'y a rien à craindre !

Combien de Go sont encore libres/disponibles ?

 
Carl Schreiber:

J'ai (ordinateur portable, 8 Go de RAM, Win7-64) une utilisation équivalente de la RAM pour chacun de mes 4 mt4.

Je pense que vous n'avez pas à vous inquiéter !

Combien de Go sont encore libres/disponibles ?

J'ai beaucoup de RAM aux niveaux indiqués ci-dessus dans les graphiques. Le problème est que lorsque je le laisse tourner, il augmente lentement l'utilisation de la RAM.

Au bout d'une heure ou deux, elle commence à atteindre son maximum.

J'exécute actuellement l'EA sur un serveur 2012, 7 Go de RAM, 4 cœurs (je ne suis pas sûr de leur taille), 64 bits.

 
gr101:

J'ai beaucoup de RAM aux niveaux indiqués ci-dessus dans les graphiques. Le problème est que lorsque je le laisse tourner, il augmente lentement l'utilisation de la RAM.

Au bout d'une heure ou deux, elle commence à atteindre son maximum.

J'exécute actuellement l'EA sur un serveur 2012, 7 Go de RAM, 4 cœurs (je ne suis pas sûr de leur taille), 64 bits.

J'ai appris une fois qu'il semble que ce soit une caractéristique de Win-Server de garder autant que possible dans la mémoire.

J'ai redémarré les terminaux régulièrement mais je serais curieux de savoir si cela peut provoquer un crash ou non !

 
Carl Schreiber:

J'ai appris une fois qu'il semble que ce soit une caractéristique de Win-Server qui garde le plus possible en mémoire.

J'ai redémarré les terminaux régulièrement mais je serais curieux de savoir si cela provoque un crash ou non !

Intéressant... bien que cela semble avoir un rapport avec le chargement des symboles dans et hors du Market Watch.

Le terminal ne se plante pas, il commence simplement à fonctionner très lentement, à un rythme inutilisable.

 
gr101:

Intéressant... bien que cela semble avoir quelque chose à voir avec le chargement des symboles dans et hors du Market Watch.

Le terminal ne se plante pas, il commence juste à fonctionner très lentement, inutilement lentement.

Comment pouvez-vous vérifier cela ? Peut-être que le serveur n'est pas configuré comme une machine rapide pour les graphiques mais seulement pour les calculs mathématiques rapides et les réponses rapides sur le Web ?
 

Il s'agit d'une installation standard de Server 2012. Cependant, ma théorie est que la façon dont il est configuré n'a pas d'importance. Une fuite de mémoire occupera toujours, au fil du temps, tout l'espace de la machine.

Ainsi, peu importe la vitesse ou la quantité de RAM de la boîte, si elle a une fuite, elle atteindra la limite à un moment donné.

 

Juste pour contribuer avec mes 2 cents sur ce sujet.

Il y a beaucoup de bonnes idées ici sur les fuites de mémoire et l'augmentation, mais en ce qui concerne le sujet et la cause fondamentale, mes considérations sont les suivantes :

- le code source publié ne vérifie pas plusieurs retours de fonctions pertinentes, par exemple le retour de SymbolSelect().

- Les boucles for/while basées sur le retour des fonctions, comme SymbolsTotal(), pourraient avoir une limite ou une protection contre le retour d'une mauvaise valeur de la fonction.

Après avoir stressé/changé le code et testé à nouveau, nous pourrons peut-être trouver et prouver la cause du problème.

 

Je pense que Rogerio Figurelli a raison si de nombreux appels de fonction ne sont pas retournés , la mémoire allouée ne sera pas libérée.

Vous pouvez peut-être diminuer la taille de la pile pour voir si cela donne une erreur de dépassement de pile.

Pile

Dans chaque programme MQL4, une zone de mémoire spéciale appelée pile est allouée pour stocker les variables locales des fonctions qui sont créées automatiquement. Une pile est allouée pour toutes les fonctions. La taille de la pile par défaut est de 256 kb, la taille de la pile peut être gérée en utilisant la directive de compilation #property stacksize.

Les variables localesstatiques sont stockées au même endroit que les autres variables statiques et globales - dans une zone mémoire spéciale, qui existe séparément de la pile. Les variables créées dynamiquement utilisent également une zone de mémoire distincte de la pile.

À chaque appel de fonction, un emplacement sur la pile est alloué aux variables internes non statiques. Après la sortie de la fonction, la mémoire est à nouveau disponible pour être utilisée.

Si, à partir de la première fonction, la seconde est appelée, cette dernière occupe la taille requise de la mémoire de pile restante pour ses variables. Ainsi, lors de l'utilisation de fonctions incluses, la mémoire de la pile sera occupée séquentiellement pour chaque fonction. Cela peut conduire à un manque de mémoire pendant l'un des appels de fonction, une telle situation est appelée débordement de pile.

Par conséquent, pour les grandes données locales, il est préférable d'utiliser la mémoire dynamique - en entrant dans une fonction, allouer la mémoire, qui est requise pour les besoins locaux, dans le système (new, ArrayResize()), et en sortant de la fonction, libérer la mémoire (delete, ArrayFree()).

Voir aussi

Types de données, encapsulation et extensibilité des types,initialisation des variables, visibilité, portée et durée de vie des variables, création et suppression d'objets.

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
 

De bons points.

J'essaierai un jour et je vous ferai part des résultats.

Merci