Voracidad de la memoria RAM de la MT5, problemas con la lectura/escritura de archivos grandes - página 6
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Recomiendo hacer un cambio mínimo primero, para que la reasignación de memoria se haga con menos frecuencia. Dos líneas
m_total_rows++;
ArrayResize(m_cells,m_total_rows*m_total_columns,10000);
en bool CSVReader::AddData(string data_str,bool header) sustituir por
m_total_rows++;
if (m_total_rows*m_total_columns>ArraySize(m_cells)) ArrayResize(m_cells,2*m_total_rows*m_total_columns);
El número de reasignaciones de memoria con copia debería ser O(log(n,2)) en lugar de O(n). 20 en lugar de 600 mil. Tal vez eso sea suficiente para ti ahora.
Gracias. Quiero que sepas lo que tengo:
1. No hay cambios en la memoria - por 10 gigabytes el código actual se comió la RAM allí y allá.
2. Por velocidad:
2.1 Versión antigua 574 segundos
2.2 Nueva versión: 138 segundos.
Así que se obtiene una ganancia de 4 veces, ¡lo cual es bastante bueno! Sin embargo, la memoria es escasa, y esto no es ni mucho menos todo lo que hay que cargar....
muy útil :)
Así que convertí el CSV a binario, menos la fecha.
Lo que resulta, cuando se ejecuta el script ocupó 1 gigabyte de memoria, que en comparación con 10 es muy bueno. Sin embargo, sigue siendo mucho :)
En términos de velocidad: ¡sólo 16 segundos! Bastante bien.
Recomiendo hacer un cambio mínimo primero, para que la reasignación de memoria se haga con menos frecuencia. Dos líneas
m_total_rows++;
ArrayResize(m_cells,m_total_rows*m_total_columns,10000);
en bool CSVReader::AddData(string data_str,bool header) sustituir por
m_total_rows++;
if (m_total_rows*m_total_columns>ArraySize(m_cells)) ArrayResize(m_cells,2*m_total_rows*m_total_columns);
El número de reasignaciones de memoria con copia debería ser O(log(n,2)) en lugar de O(n). 20 en lugar de 600 mil. Tal vez eso sea suficiente para ti.
En realidad, el tercer parámetro de ArrayResize() se especifica por una razón... Es un mal cambio.
Lea la documentación
En realidad, el tercer parámetro de ArrayResize() se especifica por una razón... un cambio de pluma...
Lea la documentación
¿Qué has conseguido sacar de la documentación sobre el tercer parámetro, útil para este caso, a la hora de resolver la tarea de levantar en memoria .csv 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 la búsqueda binaria...
Gracias. Ya os contaré lo que salga:
1. No hay cambios en la memoria - por 10 gigabytes el código actual se comió la RAM allí y allá.
2. Por velocidad:
2.1 Versión antigua 574 segundos
2.2 Nueva versión: 138 segundos.
Así que se obtiene una ganancia de 4 veces, ¡lo cual es bastante bueno! Sin embargo, la memoria es escasa, y no hay que cargar mucho ....
Después de la lectura, en bool CSVReader::Load(int start_line), después de la línea
FileClose(filehandle);
insertar liberación de memoria
ArrayResize(m_cells,m_total_rows*m_total_columns);
Libera el 0-50% innecesario de la memoria ocupada por m_cells. Sólo m_cells en sí, sin el contenido de las celdas.
Ahora estoy haciendo una pequeña biblioteca para trabajar rápidamente con CSV.
¡¡¡En la captura de pantalla hay una prueba que pasa en 7 segundos!!! Procesador Xeon, frecuencia 3.0.
En primer lugar, el script crea el formato de datos para cada columna. Hay 6 columnas. A continuación, se añaden 1000000 filas a la tabla y se rellenan con números del 0 al 999999. Según el formato de los datos, las cifras pueden percibirse de forma diferente. A continuación, todo se guarda en un archivo.
El tamaño del archivo es de 65,4 MB. Toda la estructura ocupaba 232 MB de memoria.
Así que convertí el CSV a binario, menos la fecha.
Lo que resulta, cuando se ejecuta el script ocupó 1 gigabyte de memoria, que en comparación con 10 es muy bueno. Sin embargo, sigue siendo mucho :)
En términos de velocidad: ¡sólo 16 segundos! Bastante bien.
Bueno, el guión en sí mismo sigue siendo un poco cojo.
Después de la lectura, en bool CSVReader::Load(int start_line), después de la línea
FileClose(filehandle);
insertar liberación de memoria
ArrayResize(m_cells,m_total_rows*m_total_columns);
Libera el 0-50% innecesario de la memoria ocupada por m_cells. Sólo m_cells en sí, sin el contenido de las celdas.
Gracias, pero después de cerrar el archivo/terminar el script, la memoria se libera rápidamente de todos modos. Así se reduce el consumo mientras se corre....
Ahora estoy haciendo una pequeña biblioteca para el manejo rápido de CSV.
¡¡¡En la captura de pantalla hay una prueba que pasa en 7 segundos!!! Procesador Xeon, frecuencia 3.0.
En primer lugar, el script crea el formato de datos para cada columna. Hay 6 columnas. A continuación, se añaden 1000000 filas a la tabla y se rellenan con números del 0 al 999999. Según el formato de los datos, las cifras pueden percibirse de forma diferente. A continuación, todo se guarda en un archivo.
El tamaño del archivo es de 65,4 MB. Toda la estructura ocupaba 232 MB de memoria.
Bastante interesante. ¿Piensa publicar sus logros en materia de programación?
Bueno, el guión en sí sigue siendo un desastre.
¿Puede decirme qué hay que arreglar en él?