Voracidad de la memoria RAM de la MT5, problemas con la lectura/escritura de archivos grandes - página 7

 
Resulta que mi terminal sin el script se está comiendo 820mb, por lo que el binario se está comiendo 180 megabytes, lo que aparentemente está bien, dados los dos arrays llenos.
 
El tema no está bien redactado.

La memoria no se la come el terminal, sino un programa específico con una implementación concreta. En este caso, el programa MQL está almacenando los datos de forma incorrecta e ineficiente.
 
Aleksey Vyazmikin:

¿Puede decirme qué hay que arreglar en él?

Bueno, está bien que leas el array primero, pero después de leer el archivo, tienes que cerrarlo.

y luego escribir de la misma manera, no a través de su biblioteca.

 
Renat Fatkhullin:
El tema no está correctamente formulado.

La memoria no se la come el terminal, sino un programa específico con una implementación concreta. En este caso, el programa MQL está almacenando los datos de forma incorrecta e ineficiente.

El tema se formuló en el momento en que surgió el problema, cuando no había una comprensión definitiva de las causas. Partí del hecho de que tengo una clase que fue creada con la participación de un empleado de MQ, lo que significa que no tenía ninguna razón para dudar de su corrección.

Si el programa no está almacenando los datos de forma correcta y eficiente, ¿puede decirme cómo almacenarlos de forma correcta y eficiente? ¿Qué debo cambiar en la clase para que consuma menos memoria?

En general, estaría muy bien que el terminal se entregara con una clase similar para trabajar con tablas basadas en CSV.

 
Maxim Dmitrievsky:

Está bien leer la matriz primero, pero después de leer el archivo hay que cerrarlo

y escribir de la misma manera, no a través de su biblioteca.

Lo cerraré, gracias.

Tengo que escribir en dos variantes, porque el formato CSV me ayuda a ver realmente lo que pasa en las matrices - por desgracia, cometo errores y por lo tanto prefiero volver a comprobar los cálculos en excel cuando depuro el código, que sacar conclusiones erróneas después.

 
Vladimir:

¿Qué has aprendido de la documentación sobre el tercer parámetro que es útil para este caso, al resolver el problema de levantar en memoria .csvs creados en diferentes programas y que tienen un tamaño arbitrario?

Siéntase libre de sugerir un cambio mejor, no binario, que aumente la velocidad de reasignación de memoria (reduciendo el número de llamadas a ArrayResize) más que una búsqueda binaria...

Clase gratuita para principiantes:

El tercer parámetro ArrayResize especifica el tamaño real del array, un múltiplo de ese número.

ArrayResize(arr, 5, 1000) - tomará 1000 elementos en memoria.

ArrayResize(arr, 1005, 1000) - ocupará 2000 elementos en memoria.

Por eso no hay una asignación de memoria permanente.

 
Aleksey Vyazmikin:

El tema se formuló en el momento en que surgió el problema, cuando no había una comprensión definitiva de las causas. Mi suposición fue que tengo una clase que fue creada con la entrada de un empleado de MQ, lo que significa que no tenía ninguna razón para dudar de que estaba funcionando correctamente.

Si el programa no almacena los datos de forma correcta y eficiente, ¿puede decirme cómo almacenarlos de forma correcta y eficiente? ¿Qué debo cambiar en la clase para que consuma menos memoria?

En general, estaría muy bien que el terminal se entregara con una clase de este tipo para trabajar con tablas basadas en CSV.

El problema no está en la clase, sino en el uso de esta clase.

De hecho, la lectura de CSV ya está implementada a nivel de FileOpen con la bandera FILE_CSV.

No hace falta una clase entera separada para eso.

 
Roffild:

Una clase gratuita para principiantes:

El tercer parámetro ArrayResize establece el tamaño real de la matriz a un múltiplo de este número.

ArrayResize(arr, 5, 1000) - ocupará 1000 elementos en memoria.

ArrayResize(arr, 1005, 1000) - ocupará la memoria de 2000 elementos.

Por eso no hay una asignación de memoria permanente.

Vladimir, a diferencia de ti, logró analizar el código y encontrar una manera de acelerarlo. Y usted se está posicionando aquí como un teórico que no puede lidiar con el código de otra persona. Todas estas conclusiones, ¿qué te aportan, tal vez puedas demostrar que añadir parámetros adicionales acelerará el código o reducirá el consumo de memoria?


Roffild:

El problema no está en la clase, sino en cómo se utiliza la clase.

De hecho, la lectura de CSV ya está implementada a nivel de FileOpen con la bandera FILE_CSV.

No hace falta una clase entera separada para eso.

Si no entiendes para qué sirve, ¿por qué tomas decisiones por los demás? Lo que digo es que hay que hacerlo conveniente para la gente, para eso se escriben las clases.

 
Aleksey Vyazmikin:

Vladimir, a diferencia de ti, fue capaz de analizar el código y encontrar una manera de acelerarlo. Y usted se está posicionando aquí como un teórico que no puede trabajar con el código de otras personas. Todas estas conclusiones, ¿qué te aportan, tal vez puedas demostrar que añadir parámetros adicionales acelerará el trabajo o reducirá el consumo de memoria?

En realidad, Vladimir no pudo hacer la clase más rápida editándola. La clase fue creada por un "empleado de MQ" y un usuario que no leyó la documentación logró mejorar la clase?

Aleksey Vyazmikin:

Si no entiendes para qué sirve, ¿por qué decides por los demás? Yo digo que hay que hacerlo conveniente para la gente, para eso se escriben las clases.

Entonces, para utilizar las funciones estándar, ¿hay que envolverlas en clases?

¿Tal vez debería leer la documentación sobre FILE_CSV, en lugar de utilizar una clase completamente separada?

Ya se han publicado aquí otras soluciones preparadas que han sido ignoradas.

Mi solución para escribir en CSV sin límite de columnas está en mi biblioteca. Incluso se respetan los principios de la POO (no creo que conozcas este método de programación). Pero no lo recomiendo.

Es poco probable que la solución adecuada aparezca aquí de forma gratuita...

 
Roffild:

En realidad, es imposible que Vladimir haya acelerado la clase con sus ediciones. La clase fue creada por un "empleado de MQ" y el usuario, que no leyó la documentación, logró mejorar la clase?

¿Lo has comprobado y no se ha detectado ninguna aceleración? ¿O está diciendo que estoy engañando a todo el mundo aquí?

Roffild:

Entonces, para utilizar las funciones estándar, ¿hay que envolverlas en clases?

¿Tal vez debería leer la documentación sobre FILE_CSV en lugar de utilizar una clase completamente separada?

Ya se han publicado aquí otras soluciones preparadas que han sido ignoradas.

Mi solución para escribir en CSV sin límite de columnas está en mi biblioteca. Incluso se respetan los principios de la POO (no creo que conozcas este método de programación). Pero no lo recomiendo.

Es poco probable que aparezca aquí una solución gratuita...

¿Lees este hilo con atención? ¿Has visto mi respuesta a la solución lista en forma de función? ¿Tiene otra solución? Por supuesto, no sé lo que es OOP, un lector atento de este hilo se habría dado cuenta enseguida...

Sobre la rentabilidad/gratuidad - eso es ridículo, sólo estaba mostrando que las soluciones de pago no hacen que una solución sea mejor que una gratuita, mientras que tú estás hablando de dinero otra vez...