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

 
Vladislav Andruschenko:
oop

Puedo ver eso oop... por qué escribir matrices en cadenas cuando puedes escribirlas en binario de una vez

 
Maxim Dmitrievsky:

Ya lo veo... ¿por qué escribir matrices en cadenas cuando puedes escribirlas en binario de una vez?

Está escrito, el hombre los procesa en excel.

 
Sergey Savinkin:

Dice que el hombre los procesa en Excel.

no dice que

 
Maxim Dmitrievsky:

no dice eso.

El primer puesto. Si lo lees con atención, este archivo puede no tener nada que ver con MT5. O se maneja de una manera específica.

 
Sergey Savinkin:

El primer puesto. Si lees con atención, este archivo puede no tener nada que ver con MT5. O se maneja de una manera específica.

Así que deja que determine de dónde lo saca

También se puede leer como un array, supongo.
 
Aleksey Vyazmikin:

Gracias por el análisis del código.

Me cuesta entender la POO, así que hacer ediciones en ella es una tortura para mí. Según entendí se trata de la clase, que se encarga de la lectura, que allí se divide todo el archivo en arrays de cadenas, y solo entonces, si quiero, convierto estos valores de cadena a otro tipo y los pongo en arrays de tipo int en mi script. Si lo he entendido bien, para acelerar el proceso, debería leer todo el archivo y averiguar cuántas filas y columnas hay y cuántos símbolos hay en cada celda, y luego seleccionar inmediatamente el tamaño del array? Entonces, ¿cómo hacerlo?

Me gustaría entender de dónde se sacan 400 megabytes a la vez. ¿He entendido bien que se asigna la memoria, pero no se borra/regala la que se asignó anteriormente?

400 Mb son 36 millones de celdas con filas vacías, 12 bytes cada una, 12*36=432.

Para que te digan cómo hacerlo mejor, cuéntanos el problema que estás resolviendo. Con qué frecuencia y cuánto cambia el archivo, si todos tienen que leer de él cada vez, si el número de celdas no vacías es constante de línea a línea, si todas las celdas contienen sólo números enteros. Quizá haya que dedicar 9 minutos una vez a la semana y no sea mucho, entonces no hay que cambiar nada.

En general, en términos de "dónde ir para ser más rápido", la dirección principal es declarar una estructura con 57 campos correspondientes a valores enteros, y usarla tanto para escribir como para leer (el archivo es binario). Entonces, 78 Mb se leerán en menos de un segundo desde el disco directamente a la memoria, sin delimitadores ni representaciones de cadenas. Para fines de depuración, guarde también la salida en .csv. El tamaño del archivo determinará inmediatamente el número de elementos de la matriz de estas estructuras.

 
Vladimir:

400 MB son 36 millones de celdas con filas vacías, cada una de 12 bytes, 12*36=432.

Las matemáticas están claras.

Vladimir:

Para que te digan cómo hacerlo mejor, cuéntanos el problema que estás resolviendo. Con qué frecuencia y cuánto cambia el archivo, si hay que leer todo de él cada vez, si el número de celdas no vacías es constante de línea a línea, si todas las celdas contienen sólo números enteros. Quizá haya que dedicar 9 minutos una vez a la semana y no sea mucho, entonces no hay que cambiar nada.

La tarea es universal, es la lectura de archivos en formato CSV, porque este formato es universal para diferentes programas, que actualmente me proporcionan datos. Si te refieres específicamente a este script, entonces sí, sólo tienes que leer y calcular todo, porque Excel se bloquea debido a las fórmulas. Las celdas pueden contener números no enteros (no específicamente en este ejemplo). 9 minutos no es mucho si es una vez a la semana... Sin embargo, entre otras cosas, necesito trabajar con tal cantidad de datos a través del optimizador, pasando el archivo al lado y allí realizando su procesamiento con la ayuda de los agentes, luego obtener el resultado en formato csv (aquí puedo, por supuesto, utilizar otro formato) y realizar el procesamiento de nuevo. Es por eso que decidí discutir este problema públicamente, porque quiero procesar grandes matrices de datos usando MT5.

Vladimir:

En general, en términos de "dónde ir para ser más rápido" - la dirección principal: declarar la estructura, 57 campos de los cuales corresponden a los valores enteros, y lo utilizan tanto para la escritura y la lectura (archivo es binario). Entonces, 78 Mb se leerán en menos de un segundo desde el disco directamente a la memoria, sin delimitadores ni representaciones de cadenas. Para fines de depuración, guarde también la salida en .csv. El tamaño del archivo determinará inmediatamente el número de elementos de la matriz de estas estructuras.

No puedo ni imaginarme, ¿cómo se puede hacer? ¿O es que el archivo inicial debe generarse en condiciones especiales? Entonces, ¿podría hacer un convertidor de CSV a formato binario?

¿Puedes mirar también la segunda clase, cómo enseñarle a escribir un número ilimitado de columnas?

 
Maxim Dmitrievsky:

WriteArray / Read son rápidos, tamaño máximo hasta 300 mb, todo es muy rápido, no consume RAM

Por qué hay tanto código para leer/escribir, todo se hace en 4 líneas.

¿Puede demostrar cómo hacerlo?

 
Maxim Dmitrievsky:

así que deja que determine de dónde lo saca

también se puede leer como un array, supongo que

CSV es un formato de archivo universal, que se admite en varios programas informáticos, incluidos los asociados al MO.

Además, es un archivo conveniente para transferir datos entre diferentes programas (scripts/asesores) MT5, y no ocupa mucho espacio.

 
Aleksey Vyazmikin:

¿Puede demostrar cómo hacerlo?

intente leer su archivo así

https://www.mql5.com/ru/docs/files/filereadarray

No tengo tiempo de abrir el terminal ahora, tal vez mañana)

Документация по MQL5: Файловые операции / FileReadArray
Документация по MQL5: Файловые операции / FileReadArray
  • www.mql5.com
//| Структура для хранения данных о ценах                            | //| Script program start function                                    |