Metatrader 5 - Toma mucha memoria al recorrer un gráfico a través de los símbolos - página 4

 
Carl Schreiber:

¿Ha intentado establecerTERMINAL_MAXBARScon TerminalInfoInteger(..) a un valor pequeño razonable?

Además de eso tienes

TERMINAL_MEMORY_PHYSICAL

Memoria física en el sistema, Mb

int

TERMINAL_MEMORY_TOTAL

Memoria disponible para el proceso de la terminal, Mb

int

TERMINAL_MEMORIA_DISPONIBLE

Memoria libre del proceso del terminal, Mb

int

TERMINAL_MEMORIA_UTILIZADA

Memoria utilizada por el terminal, Mb

int


para comprobar dónde está el quid de la cuestión.

He puesto el TERMINAL_MAXBARS a 500 (realmente bajo) pero sigue cargando más barras (¿imagino que desde el archivo?) y la memoria sigue aumentando.

He comenzado a registrar los contadores de memoria mencionados anteriormente y pronto tendré información al respecto.

Ok tengo algunos comentarios y se ve un poco extraño. A continuación hay dos registros "MetaTrader Log" y "PowerShell Log" son dos registros que estoy ejecutando que están registrando el uso de la memoria. (El script de PowerShell es anterior en este hilo, lo actualicé para que coincida con lo que está en el Administrador de tareas). Ambos registros son la primera y la última vez que hice la última ejecución.

Puntos de interés:

  1. Los valores TERMINAL_MEMORY_PHYSICAL y TERMINAL_MEMORY_TOTAL siguen siendo los mismos. Estos valores son idénticos en todas las filas del registro.
  2. El TERMINAL_MEMORY_AVAILABLE ha disminuido de 13902 a 13806
  3. La TERMINAL_MEMORY_USED ha aumentado de 432 a 528
  4. El número de Kilo Bytes utilizados por el sistema ha pasado de 128 300 K (128,3 Mb ) en el arranque a 215 488 K (215,488 Mb) durante la duración de las pruebas

##### MetaTrader Log
##### Esto fue registrado por mi logger en Metatrader. Se emite toda la memoria

TIEMPO TERMINAL_MEMORY_PHYSICAL TERMINAL_MEMORIA_TOTAL TERMINAL_MEMORIA_DISPONIBLE TERMINAL_MEMORIA_UTILIZADA
2016.04.29 17:31:58 7167 14334 13902 432
2016.04.29 18:04:38 7167 14334 13806 528


#### Registro de PowerShell
#### Esto fue registrado por el script de PowerShell

29/04/2016 17:31:32 Kilo Bytes en uso 128 300 K
29/04/2016 18:05:08 Kilo Bytes en uso 215 488 K

 
gr101:

He puesto el TERMINAL_MAXBARS a 500 (muy bajo) pero sigue cargando más barras (¿imagino que desde el archivo?) y la memoria sigue aumentando.

He comenzado a registrar los contadores de memoria mencionados anteriormente y pronto tendré información al respecto.

Ok tengo algunos comentarios y se ve un poco extraño. A continuación hay dos registros "MetaTrader Log" y "PowerShell Log" son dos registros que estoy ejecutando que están registrando el uso de la memoria. (La secuencia de comandos PowerShell es anterior en este hilo, lo he actualizado para que coincida con lo que está en el Administrador de tareas). Ambos registros son la primera y la última vez que hice la última ejecución.

Puntos de interés:

  1. Los valores TERMINAL_MEMORY_PHYSICAL y TERMINAL_MEMORY_TOTAL siguen siendo los mismos. Estos valores son idénticos en todas las filas del registro.
  2. El TERMINAL_MEMORY_AVAILABLE ha disminuido de 13902 a 13806
  3. La TERMINAL_MEMORY_USED ha aumentado de 432 a 528
  4. El número de Kilo Bytes utilizados por el sistema ha pasado de 128 300 K (128,3 Mb ) en el arranque a 215 488 K (215,488 Mb) durante la duración de las pruebas

##### MetaTrader Log
##### Esto fue registrado por mi logger en Metatrader. Se emite toda la memoria

TIEMPO TERMINAL_MEMORY_PHYSICAL TERMINAL_MEMORIA_TOTAL TERMINAL_MEMORIA_DISPONIBLE TERMINAL_MEMORIA_UTILIZADA
2016.04.29 17:31:58 7167 14334 13902 432
2016.04.29 18:04:38 7167 14334 13806 528


#### Registro de PowerShell
#### Esto fue registrado por el script de PowerShell

29/04/2016 17:31:32 Kilo Bytes en uso 128 300 K
29/04/2016 18:05:08 Kilo Bytes en uso 215 488 K

Yo (portátil, 8GB de ram, Win7-64) tengo un uso de ram equivalente para cada uno de mis 4 mt4.

¡Creo que no es nada de lo que tengas que preocuparte!

¿Cuántos GB quedan libres/disponibles?

 
Carl Schreiber:

Yo (portátil, 8GB de ram, Win7-64) tengo un uso de ram equivalente para cada uno de mis 4 mt4.

Creo que no es nada de lo que tengas que preocuparte.

¿Cuántos GB están todavía libres/disponibles?

Tengo un montón de RAM en los niveles anteriores en los gráficos. El problema es que cuando lo dejo en marcha va subiendo poco a poco el uso de la RAM.

Así que después de una hora o dos empieza a llegar al máximo.

Actualmente estoy ejecutando el EA en el servidor 2012, 7 GB de RAM, 4 núcleos (no estoy seguro de lo que son), 64 bits.

 
gr101:

Tengo un montón de RAM en los niveles de arriba en los gráficos. El problema es que cuando lo dejo funcionando, lentamente aumenta el uso de la RAM.

Así que después de una hora o dos empieza a llegar al máximo.

Actualmente estoy ejecutando el EA en el servidor 2012, 7 GB de RAM, 4 núcleos (no estoy seguro de lo que son), 64 bits.

Una vez me enteré de que parece ser una característica de Win-Server mantener lo más posible en la memoria.

He reiniciado los terminales con regularidad, pero me gustaría saber si esto podría causar un accidente o no.

 
Carl Schreiber:

Una vez aprendí que parece ser una característica de Win-Server que mantiene todo lo posible en la memoria.

He reiniciado los terminales regularmente, pero me gustaría saber si esto puede causar una caída o no.

Interesante... aunque parece que tiene que ver con la carga de símbolos dentro y fuera del Market Watch.

El terminal no se bloquea, sólo empieza a funcionar muy lento, inutilmente lento.

 
gr101:

Interesante... aunque parece que tiene que ver con la carga de símbolos dentro y fuera del Market Watch.

El terminal no se bloquea, sólo empieza a funcionar muy lento, inutilmente lento.

¿Cómo se puede comprobar esto? ¿Tal vez el servidor no está configurado como una máquina rápida para los gráficos, sino sólo para los cálculos matemáticos rápidos y las respuestas web rápidas?
 

Es una instalación estándar de Server 2012. Sin embargo mi teoría es que no importa cómo esté configurado. Una fuga de memoria, con el tiempo, siempre ocupará todo el espacio de la máquina.

Así que no importa la velocidad o la cantidad de RAM que tenga la caja, si tiene una fuga entonces llegará al límite en algún momento.

 

Sólo para contribuir con mis 2 centavos en este tema.

Hay un montón de buenas ideas aquí sobre la fuga de memoria y el aumento, pero con respecto al tema y la causa raíz mis consideraciones son:

- el código fuente publicado no comprueba varios retornos de funciones relevantes, por ejemplo el retorno de SymbolSelect().

- Los bucles for/while basados en retornos de funciones, como SymbolsTotal() podrían tener algún límite o protección contra algún retorno de función de valor erróneo.

Después de estresar/cambiar el código y probar de nuevo, tal vez podamos encontrar y comprobar la causa raíz del problema.

 

Creo que Rogerio Figurelli tiene razón, si muchas llamadas a funciones no son devueltas, la memoria asignada no será liberada.

Tal vez puedas disminuir el tamaño de la pila para ver si da error de desbordamiento de pila.

Pila

En cada programa MQL4, se asigna un área de memoria especial llamada pila para almacenar las variables locales de las funciones que se crean automáticamente. Se asigna una pila para todas las funciones. El tamaño de la pila por defecto es de 256 kb, el tamaño de la pila se puede gestionar utilizando la directiva del compilador #property stacksize.

Las variables localesestáticas se almacenan en el mismo lugar en el que se almacenan otras variables estáticas y globales - en un área de memoria especial, que existe por separado de la pila. Las variables creadas dinámicamente también utilizan un área de memoria separada de la pila.

Con cada llamada a una función, se asigna un lugar en la pila para las variables internas no estáticas. Tras salir de la función, la memoria vuelve a estar disponible para su uso.

Si desde la primera función se llama a la segunda, entonces la segunda función ocupa el tamaño necesario de la memoria de la pila restante para sus variables. Así, cuando se utilizan funciones incluidas, la memoria de la pila se ocupará secuencialmente para cada función. Esto puede llevar a una escasez de memoria durante una de las llamadas a la función, tal situación se llama desbordamiento de la pila.

Por lo tanto, para los datos locales grandes es mejor utilizar la memoria dinámica - al entrar en una función, asignar la memoria, que se requiere para las necesidades locales, en el sistema (new, ArrayResize()), y al salir de la función, liberar la memoria (delete, ArrayFree()).

Véase también

Tipos de Datos, Encapsulación y Extensibilidad de Tipos,Inicialización de Variables, Alcance de la Visibilidad y Tiempo de Vida de las Variables, Creación y Eliminación de Objetos

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
 

Buenos puntos.

Lo probaré en algún momento y comentaré aquí los resultados.

Gracias