Metatrader 5 - Consomme beaucoup de mémoire lorsqu'on fait défiler les symboles d'un graphique. - page 4
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
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 :
##### Journal de MetaTrader
##### Ceci a été enregistré par mon logger dans Metatrader. Il affiche toute la mémoire
#### 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 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 :
##### Journal de MetaTrader
##### Ceci a été enregistré par mon logger dans Metatrader. Il affiche toute la mémoire
#### 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 ?
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.
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 !
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.
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.
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.
De bons points.
J'essaierai un jour et je vous ferai part des résultats.
Merci