Metatrader 5 - Benötigt viel Speicher beim Durchlaufen eines Charts durch Symbole - Seite 4

 
Carl Schreiber:

Haben Sie versucht,TERMINAL_MAXBARSmit TerminalInfoInteger(..) auf einen vernünftigen kleinen Wert zu setzen?

Außerdem haben Sie:

TERMINAL_MEMORY_PHYSICAL

Physischer Speicher im System, Mb

int

TERMINAL_MEMORY_TOTAL

Für den Prozess des Terminals verfügbarer Speicher, Mb

int

TERMINAL_MEMORY_AVAILABLE

Freier Speicher des Terminalprozesses, Mb

int

TERMINAL_MEMORY_USED

Vom Terminal belegter Speicher, Mb

int


um zu prüfen, wo der Knackpunkt liegt.

Ich habe TERMINAL_MAXBARS auf 500 gesetzt (wirklich niedrig), aber es werden immer noch mehr Balken geladen (ich nehme an, das kommt aus der Datei?) und der Speicher steigt weiter an.

Ich habe damit begonnen, die oben aufgeführten Speicherzähler zu protokollieren und werde bald eine Rückmeldung dazu geben.

Ok, ich habe ein paar Rückmeldungen bekommen und es sieht ein wenig seltsam aus. Unten sind zwei Protokolle "MetaTrader Log" & "PowerShell Log" sie sind zwei Protokolle, die ich laufen lasse, die die Speichernutzung protokollieren. (Das PowerShell-Skript befindet sich weiter oben in diesem Thread, ich habe es aktualisiert, damit es mit dem Task-Manager übereinstimmt). Diese beiden Protokolle sind das erste und letzte Mal, als ich den letzten Lauf durchgeführt habe.

Interessante Punkte:

  1. Die Werte TERMINAL_MEMORY_PHYSICAL und TERMINAL_MEMORY_TOTAL bleiben gleich. Diese Werte sind in jeder Zeile des Protokolls identisch.
  2. Der TERMINAL_MEMORY_AVAILABLE ist von 13902 auf 13806 gesunken.
  3. Der TERMINAL_MEMORY_USED ist von 432 auf 528 gestiegen.
  4. Die Anzahl der vom System verbrauchten Kilobytes stieg von 128 300 K (128,3 Mb) beim Start auf 215 488 K (215,488 Mb) während der gesamten Testdauer

##### MetaTrader-Protokoll
##### Dies wurde von meinem Logger in Metatrader protokolliert. Es gibt den gesamten Speicher aus

ZEIT TERMINAL_SPEICHER_PHYSIKALISCH TERMINAL_SPEICHER_INSGESAMT TERMINAL_SPEICHER_VERFÜGBAR TERMINAL_MEMORY_USED
2016.04.29 17:31:58 7167 14334 13902 432
2016.04.29 18:04:38 7167 14334 13806 528


#### PowerShell-Protokoll
#### Dies wurde durch das PowerShell-Skript protokolliert

04/29/2016 17:31:32 Kilo Bytes in Gebrauch 128 300 K
29.04.2016 18:05:08 Verwendete Kilobyte 215 488 K

 
gr101:

Ich setzte die TERMINAL_MAXBARS auf 500 (wirklich niedrig), aber es ist immer noch das Laden mehr Bars (vorstellen, dass aus der Datei?) und der Speicher ist immer noch schleichende bis.

Ich habe damit begonnen, die oben aufgeführten Speicherzähler zu protokollieren und werde bald eine Rückmeldung dazu geben.

Ich habe einige Rückmeldungen erhalten, und es sieht ein wenig seltsam aus. Unten sind zwei Protokolle "MetaTrader Log" & "PowerShell Log" sie sind zwei Protokolle, die ich laufen lasse, die die Speichernutzung protokollieren. (Das PowerShell-Skript befindet sich weiter oben in diesem Thread, ich habe es aktualisiert, damit es mit dem Task-Manager übereinstimmt). Diese beiden Protokolle sind das erste und letzte Mal, als ich den letzten Lauf durchgeführt habe.

Interessante Punkte:

  1. Die TERMINAL_MEMORY_PHYSICAL und TERMINAL_MEMORY_TOTAL bleiben gleich. Diese Werte sind in jeder Zeile des Protokolls identisch.
  2. Der TERMINAL_MEMORY_AVAILABLE ist von 13902 auf 13806 gesunken.
  3. Der TERMINAL_MEMORY_USED ist von 432 auf 528 gestiegen.
  4. Die Anzahl der vom System verbrauchten Kilobytes stieg von 128 300 K (128,3 Mb) beim Start auf 215 488 K (215,488 Mb) während der gesamten Testdauer

##### MetaTrader-Protokoll
##### Dies wurde von meinem Logger in Metatrader protokolliert. Es gibt den gesamten Speicher aus

ZEIT TERMINAL_SPEICHER_PHYSIKALISCH TERMINAL_SPEICHER_INSGESAMT TERMINAL_SPEICHER_VERFÜGBAR TERMINAL_MEMORY_USED
2016.04.29 17:31:58 7167 14334 13902 432
2016.04.29 18:04:38 7167 14334 13806 528


#### PowerShell-Protokoll
#### Dies wurde durch das PowerShell-Skript protokolliert

04/29/2016 17:31:32 Kilo Bytes in Gebrauch 128 300 K
29.04.2016 18:05:08 Verwendete Kilobyte 215 488 K

Ich (Notebook, 8GB RAM, Win7-64) habe für jeden meiner 4 mt4 den gleichen RAM-Verbrauch.

Ich denke, das ist nichts, worüber Sie sich Sorgen machen müssen!

Wie viele GB sind noch frei/verfügbar?

 
Carl Schreiber:

Ich (Notebook, 8 GB Ram, Win7-64) habe für jeden meiner 4 mt4 den gleichen Ram-Verbrauch.

Ich denke, das ist nichts, worüber Sie sich Sorgen machen müssen!

Wie viele GB sind noch frei/verfügbar?

Ich habe jede Menge RAM mit den oben genannten Werten in den Diagrammen. Das Problem ist, wenn ich es laufen lasse, steigt der RAM-Verbrauch langsam an.

Nach etwa ein oder zwei Stunden ist das Maximum erreicht.

Ich führe derzeit die EA auf Server 2012, 7 GB RAM, 4 Kerne (nicht sicher, was sie sind), 64 Bit.

 
gr101:

Ich habe eine Menge RAM auf den Ebenen oben in den Diagrammen. Das Problem ist, wenn ich es laufen lasse, steigt die RAM-Nutzung langsam an.

So nach etwa einer Stunde oder zwei beginnt es maxing aus.

Ich führe derzeit die EA auf Server 2012, 7 GB RAM, 4 Kerne (nicht sicher, was sie sind), 64 Bit.

Ich habe einmal gelernt, dass es eine Funktion von Win-Server zu sein scheint, so viel wie möglich im Speicher zu halten.

Ich habe die Terminals regelmäßig neu gestartet, aber ich wäre neugierig, ob dies einen Absturz verursachen würde oder nicht!

 
Carl Schreiber:

Ich habe einmal gelernt, dass es eine Funktion von Win-Server zu sein scheint, so viel wie möglich im Speicher zu halten.

Ich habe die Terminals regelmäßig neu gestartet, aber ich wäre neugierig, ob dies einen Absturz verursachen würde oder nicht!

Interessant... obwohl es etwas mit dem Laden von Symbolen in und aus dem Market Watch zu tun zu haben scheint.

Das Terminal stürzt nicht ab, es beginnt nur sehr langsam zu laufen, unbrauchbar langsam.

 
gr101:

Interessant... obwohl es etwas mit dem Laden von Symbolen in und aus dem Market Watch zu tun zu haben scheint.

Das Terminal stürzt nicht ab, es beginnt nur sehr langsam zu laufen, unbrauchbar langsam.

Wie kann man das überprüfen? Vielleicht ist der Server nicht als schnelle Maschine für Grafiken eingerichtet, sondern nur für schnelle mathematische Berechnungen und schnelle Webantworten?
 

Es ist eine Standardinstallation von Server 2012. Meine Theorie ist jedoch, dass es keine Rolle spielt, wie es eingerichtet ist. Ein Speicherleck wird mit der Zeit immer den gesamten Speicherplatz auf dem Rechner belegen.

Es spielt also keine Rolle, wie schnell oder wie viel RAM der Rechner hat, wenn er ein Leck hat, wird er irgendwann an die Grenze stoßen.

 

Ich möchte nur meine 2 Cents zu diesem Thema beitragen.

Es gibt hier viele gute Ideen zum Thema Memory Leak und Erhöhung, aber zum Thema und der Ursache sind meine Überlegungen:

- der veröffentlichte Quellcode prüft mehrere relevante Funktionsrückgaben nicht, z.B. SymbolSelect() return.

- for/while-Schleifen, die auf Funktionsrückgaben basieren, wie z.B. SymbolsTotal(), könnten eine Begrenzung oder einen Schutz gegen Funktionsrückgaben mit falschen Werten haben.

Nachdem wir den Code gestresst/geändert und erneut getestet haben, können wir vielleicht die Ursache des Problems finden und nachvollziehen.

 

Ich denke, Rogerio Figurelli hat Recht, wenn viele Funktionsaufrufe nicht zurückgegeben werden , wird der zugewiesene Speicher nicht freigegeben.

Vielleicht können Sie die Stackgröße verringern, um zu sehen, ob es zu einem Stack Overflow-Fehler kommt.

Stapel

In jedem MQL4-Programm wird ein spezieller Speicherbereich namens Stack für die Speicherung lokaler Funktionsvariablen zugewiesen, die automatisch erstellt werden. Ein Stack wird für alle Funktionen zugewiesen. Die Standard-Stackgröße beträgt 256 kb, die Stackgröße kann mit der Compilerdirektive #property stacksize verwaltet werden.

Statische lokale Variablen werden dort gespeichert, wo auch andere statische und globale Variablen gespeichert werden - in einem speziellen Speicherbereich, der getrennt vom Stack existiert. Dynamisch erstellte Variablen verwenden ebenfalls einen vom Stack getrennten Speicherbereich.

Bei jedem Funktionsaufruf wird ein Platz auf dem St ack für interne nicht-statische Variablenzugewiesen. Nach Beendigung der Funktion steht der Speicher wieder zur Verfügung.

Wird von der ersten Funktion die zweite aufgerufen, so belegt die zweite Funktion für ihre Variablen die benötigte Größe aus dem verbleibenden Stack-Speicher. Bei der Verwendung eingeschlossener Funktionen wird der Stapelspeicher also nacheinander für jede Funktion belegt. Dies kann dazu führen, dass bei einem der Funktionsaufrufe der Speicher knapp wird; eine solche Situation wird als Stack-Überlauf bezeichnet.

Daher sollten Sie für große lokale Daten besser dynamischen Speicher verwenden - beim Eintritt in eine Funktion den Speicher, der für den lokalen Bedarf benötigt wird, im System allozieren (new, ArrayResize()) und beim Verlassen der Funktion den Speicher freigeben (delete, ArrayFree()).

Siehe auch

Datentypen, Kapselung und Erweiterbarkeit von Typen,Initialisierung von Variablen, Sichtbarkeitsbereich und Lebensdauer von Variablen, Erstellen und Löschen von Objekten

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
 

Gute Punkte.

Ich werde das mal ausprobieren und hier über die Ergebnisse berichten.

Danke

Grund der Beschwerde: