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

 
Vladislav Andruschenko:


Ya me he encontrado con este problema. Hice muchos arreglos. No lo recuerdo todo, fue una tarea única,

pero prueba a ponerArrayResize(arrRead_01,arrSize); el tercer parámetro aquí


intreserve_size=0// valor del tamaño de la reserva (exceso )


y experimentar.

Gracias, pero todos los retrasos y el consumo de memoria, a juzgar por mis experimentos, se producen en la clase de lectura de información del archivo. ¿Tal vez se pueda ajustar algo ahí?

 
También me gustaría mucho que me ayudaran con la segunda pregunta: la restricción de grabación, ¿alguien ha resuelto este problema?
 

A juzgar por la velocidad de reasignación de memoria, las matrices de cadenas se almacenan como matrices de objetos, no como punteros a ellas, de ahí los frenos. Necesitamos que los desarrolladores aclaren esta cuestión, la solución depende de ello.

A continuación, el analizador crea una matriz local de celdas a partir de la cadena y luego las copia en la memoria asignada, lo cual es una muleta innecesaria, y además significativa.

Si es como una matriz de objetos - entonces, dependiendo de la frecuencia y el número de actualizaciones de las celdas en el problema, probablemente sería más barato en tiempo no analizar el archivo en la carga, y almacenar xw-file como una matriz de líneas de archivo y actualizar los datos sobre la marcha (es decir, analizar la cadena en cada acceso a la celda). En cualquier caso, es necesario reescribir el analizador sintáctico, que es extremadamente ineficiente y no admite las celdas citadas y sólo es adecuado para importar tablas numéricas.

 
SeriousRacoon:

A juzgar por la velocidad de reasignación de la memoria, las matrices de cadenas se almacenan como matrices de objetos, no como punteros a ellas, de ahí los frenos. Necesitamos que los desarrolladores aclaren esta cuestión, la solución depende de ello.

Vamos a intentar llamar al desarrollador,@Renat Fatkhullin- ¿puede aclarar la situación?

SeriousRacoon:

Entonces, el analizador crea una matriz local de celdas a partir de una cadena y luego las copia en la memoria asignada - una muleta innecesaria, y una significativa.

¿Cómo podemos deshacernos de él?

SeriousRacoon:

Si como matrices de objetos, dependiendo de la frecuencia y el número de actualizaciones de las celdas en el problema, probablemente, sería más barato en tiempo no analizar el archivo en la carga, y almacenar xw-file como matriz de líneas de archivo y actualizar los datos sobre la marcha (es decir, analizar la cadena en cada acceso a la celda). En cualquier caso, hay que reescribir el analizador sintáctico, es extremadamente ineficiente y no admite las celdas citadas y sólo sirve para importar tablas numéricas.

"Matriz de líneas de archivo": ¿qué quiere decir con eso? Si sólo se trata de crear un array para contener todas las cadenas, entonces, según tengo entendido, la longitud de la cadena tiene un límite de caracteres, ¿no?

La clase de lectura fue escrita por un empleado de MQ, pensé que todo estaba inteligentemente escrito allí.

El parser lee el texto correctamente, no estoy de acuerdo contigo aquí - el script anteriormente adjunto lo confirma.

 
Aleksey Vyazmikin:

Vamos a intentar llamar al desarrollador,@Renat Fatkhullin- ¿puede aclarar la situación?

¿Cómo puede deshacerse de él?

"Matriz de cadenas de archivos": ¿a qué se refiere? Si sólo se trata de crear un array que contenga todas las cadenas, por lo que entiendo, la longitud de la cadena tiene limitaciones en el número de caracteres, ¿no?

La clase de lectura fue escrita por un empleado de MQ, pensé que todo estaba inteligentemente escrito allí.

El parser lee correctamente el texto, no estoy de acuerdo contigo - el script que se adjuntó anteriormente lo confirma.

Lee correctamente los archivos en los que no hay cadenas entrecomilladas, dentro de las cuales hay un carácter delimitador. Intenta leer 60;""muestra;cadena"" por ella. La salida debe contener 2 celdas: [60] y [muestra;cadena]. Probablemente obtendrá 3 - [60] ["muestra;cadena"]. (HH además, qusv permite cadenas con guiones :) )

Ya sé cómo me libraría de esto en C o pluses - asignar un array de punteros de cadena primero y llenarlo analizando la cadena. No hay punteros en mcl, no entiendo cómo abordar esta tarea. Esperemos que Renat pueda aclararlo.

"Una matriz de cadenas de archivos": ¿qué quiere decir con eso? Si sólo se trata de crear un array que contenga todas las cadenas, por lo que entiendo, la longitud de la cadena tiene un límite de caracteres, ¿no?

Es decir, leer el archivo línea por línea y almacenar cada línea original del archivo en un array sin analizarlo. Cuando se accede a una cadena por formato (fila, columna), se toma la fila de la cadena, se analiza sobre la marcha y se da el valor de la columna, almacenando en caché el resultado del análisis al mismo tiempo.

 

He aquí otra posible solución. Al leer un archivo, realiza un análisis sintáctico - guarda para cada línea un array de dos valores enteros: el índice del carácter que inicia el valor de la celda en la línea, y la longitud de esa subcadena.

Por ejemplo:

строка в файле : 54;345;12;12345
индекс символа : 0  3   7  10
длина подстроки: 2  3   2  5

Aquí se encuentran los valores de los índices y las longitudes y se guardan para su posterior análisis en la demanda.
 
SeriousRacoon:

Lee correctamente los archivos en los que no hay cadenas entrecomilladas con un carácter delimitador dentro. Intenta leer 60;""muestra;cadena"" con ella. La salida debe ser de 2 celdas: [60] y [muestra;cadena]. Probablemente obtendrá 3 - [60] ["muestra;cadena"]. (HH además, qusv permite cadenas con guiones :) )

Ah, ya veo, no sabía de esas sutilezas del estándar CSV. ¡Gracias por ilustrarme sobre las peculiaridades!

SeriousRacoon:

Sé cómo me libraría de ello en C o en los pluses: primero asignaría un array de punteros de cadena y lo rellenaría, analizando la cadena. No hay punteros en mcl, no entiendo cómo abordar esta tarea. Esperemos que Renat pueda aclararlo.

Esperemos que Renat pueda aclararlo.

SeriousRacoon:

Es decir, leer el archivo línea por línea y almacenar cada línea original del archivo en un array sin analizarlo. Al acceder a la cadena por el formato (fila, columna), toma la fila de la cadena, la analiza sobre la marcha y devuelve el valor de la columna, almacenando en caché el resultado del análisis.

Sí, creo que sería óptimo en el tiempo, incluso el caché no es realmente necesario, supongo. ¿Puedes ayudar y hacer las modificaciones oportunas en la clase para aplicar este enfoque?

 
SeriousRacoon:

He aquí otra posible solución. Al leer un archivo, realiza un análisis sintáctico - guarda para cada línea un array de dos valores enteros: el índice del carácter que inicia el valor de la celda en la línea, y la longitud de esa subcadena.

Por ejemplo:

строка в файле : 54;345;12;12345
индекс символа : 0  3   7  10
длина подстроки: 2  3   2  5

Aquí están los valores de índice y longitud y los guardamos para su posterior análisis en la demanda.

Pues sí, es más o menos el planteamiento que he escrito hoy arriba: calcular primero qué es qué y luego rellenar la matriz. Pero no tengo ni idea de cómo implementarlo :(

 

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

 
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

Acerca de
Razón de la queja: