Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Guardar matriz en un archivo (para cargarla posteriormente) (https://www.clubdelphi.com/foros/showthread.php?t=49057)

ixMike 11-10-2007 19:33:02

Guardar matriz en un archivo (para cargarla posteriormente)
 
Muy buenas.

Necesito guardar el contenido de una matriz en un archivo. Los elementos de la matriz son de tipo Integer, y actualmente tengo un sistema, que va elemento por elemento guardándolo en un archivo (mediante el método Write).
Lo que pasa es que este método se hace un poco lento cuando la matriz empieza a contener cientos y miles de miles de elementos.

Sé que hay un sistema para hacerlo directamente, mediante BlocRead y BlocWrite, pero no sé cómo usarlos. ¿Alguien me podría ayudar?

La matriz la declaro con un número indefinido de valores (Matriz: array [0..0] of integer;), para después asignarle el tamaño que necesite con GetMem, y vaciarla con FreeMem.


Gracias a todos por vuestra atención.

juanelo 11-10-2007 19:43:40

Hola,
Una opcion es que lo guardes mediante un TFileStream, y lo recuperes de igual manera.
Saludos

Robert01 11-10-2007 19:47:53

Hola

Seoane Hace un tiempo respondió en un post sobre bloackread y blockwrite si mal no recuerdo para partir archivos en otros más pequeños.

Tal vez el problema no es escribir una matriz muy grande sino el tamaño del archivo generado

Me pregunto si es tan lento resulta escribir a un archivo una matriz aunque tenga varios miles de columnas y de filas

Que tipo de archivo usas? Un archivo de texto?

Saludos

ixMike 11-10-2007 20:00:30

El código (así, de memoria) es más o menos este

Código Delphi [-]
var
 N: Integer;
 F: File of integer;
begin
AssignFile(F, 'C:\archivo.num');
Rewrite(F);
for n:=0 to maximo-1 do // maximo es el numero de filas de la matriz
  Write(F,Matriz[n]);
CloseFile(F);
end;


El archivo no es de texto, sino tipo Integer. Ir numero por número hace el trabajo lento (ya me ha pasado otras veces con otras cosas, si mal no recuerdo leyendo carácteres unicode de archivos).

El código para leer el archivo es similar (Read en vez de Write y poco más).

Robert01 11-10-2007 23:59:41

¿No podrías subir un archivo con una matriz grande para probar con algún codigo?

Robert01 12-10-2007 00:56:08

Estube probando un poco.

Puse en un stringgrid matrices de valores aleatorios enteros, una matriz de 500 * 500 (el archivo resultante es de 976 kb) y una de 3000*3000 (el archivo es de 34 mb).

Creo que la peor forma de guardar los datos en usar un archivo de tipo File of integer.

Se me ocurre. Tendría que probar otra forma para tener una idea bien clara.

Robert01 12-10-2007 01:39:36

Como usar BlockWrite

Como usar BlockRead

ixMike 28-10-2007 15:03:26

Gracias por los enlaces.

El caso es que yo estaba seguro de que ya las había utilizado antes....

¡fue aquí!

Gracias de nuevo.

Saludos.


La franja horaria es GMT +2. Ahora son las 11:20:38.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi