Si bien tiene relación con lo que estuve analizando en otro hilo. En esta ocasión me pregunto en como debería proceder a la lectura y almacenado de un archivo mediante buffers.
De lo que estuve analizando sobre las diferentes opciones de como leer un archivo, lo más apropiado cuando se trata de archivos grandes (de 10+ MB) es leerlo por "bloques" y procesarlo.
Hasta el momento no he tocado nunca esta técnica. Con el común STringList o sus "parientes" me era suficiente para manejar unos cuantos miles de líneas. Esta vez, me planteo cosas más complejas y requerien de mejores opciones.
Necesito leer y almacenar vectores y matrices de grandes dimensiones. El primer punto: estos son dinámicos. Y no hay un tamaño fijo.
Mi prueba de rendimiento, para ver el peor caso, inicial consistió en generar un archivo para una matriz de un poco más de 10mil x 10mil. Si bien no sospecho llegar a tanto... si seguro que necesito tamaños del orden de las 6 a 7 cifras (cuanto mucho) pero necesito que esto sea abierto. La técnica empleada es la usanza de la vieja escuela y el simple write/writeln. Naturalmente el archivo superó los 2GB y hasta mi Hulk-PC se tomó el tiempito de generarlo.
En vista a que no he tocado en mi vida la generación de archivos por otra forma, me sueltan dudas de como debo proceder a leer y/o escribir en el buffer.
Hasta donde se, tal buffer se debe declarar de un tamaño fijo y de tipo byte (o char) como por ejemplo:
Buffer = array[0..1023] of Byte;
Pero en vista a que mis estructuras son:
type TVector = array of Double; TMatrix = array of array of Double;
¿Cómo le hago para almacenar y leer desde este buffer considerando que la info que pretendo almacenar sea del tipo Double?
Mi máxima meta es tener un archivo que tenga la siguiente estructura:
Rows:<CantFilas>
Cols:<CantColumnas>
Orientation:<moRow|moCol> // que sirve para indicar si se trata de una matriz de filas o una matriz de columnas
Data:
1.23456790E+308
....
Es decir que tuviera una especie de un archivo ini a modo de header que tenga la info de las dimensiones y la orientación. Esto me sirve para determinar la forma de proceder al "indexado". El algoritmo de como convertir una coordenada [i,j] a Idx (posición en el archivo) y viceversa lo tengo.
Para los vectores es similar, como estos no tienen una 2da dimensión solo hace falta una y tampoco es estrictamente necesario tener la orientación.
El tener el Header con las dimensiones también me permitiría comprobar si efectivamente la cantidad de "items" se corresponden.
Mi prueba y versión inicial del archivo no tenía este header. ¿Como le podría incorporar esto?
La otra duda que tengo, es si ante los cambios en los datos (por ciertos cálculos) de mis estructuras me sería conveniente generar un nuevo archivo de cero, o si es viable la posibilidad de sobreescribirlo sin problemas. Si hay cambios no los será en su dimensión pero si en el contenido.
¿Alguna orientación?
Saludos,