Ir al contenido


Foto

Dudas sobre la cláusula packed

packed arrays archivos

  • Por favor identifícate para responder
3 respuestas en este tema

#1 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 02 abril 2015 - 01:43

Buenas.

Tengo una serie de dudillas a ver si alguien me puede ayudar a evacuarlas. Como dice el título ¿Para qué, y cuando, se usa packed?

 

De lo que se, y entiendo, la clásula packed permite "comprimir" los tipos de datos y ahorrar memoria.

 

Si yo tengo arreglos dinámicos, como:


php
  1. TVector = array of Double;
  2. TMatrix = array of array of Double;

¿Se puede packed? Porque hasta ahora los ejemplos que he visto son sobre arreglos de tamaño fijo. Es decir ¿Puedo hacer esto?:


php
  1. TPackedVector = packed array of Double;
  2. TPackedMatrix = packed array of array of Double;

¿El hacerlos "empaquetados" (por darle un nombre) condiciona en algo? ¿Se puede trabajar sobre estos arreglos como siempre? ¿O hay algún tratamiento especial?

 

¿Si yo quisiera luego guardar los datos en un archivo para poder recuperarlos lo puedo hacer de forma simple ya sea con TFileStream o el write/read() de la vieja escuela? ¿O hay que hacer algo? ¿Sería buena opción para grandes volúmenes? ¿O para grandes dimensiones son más apropiadas otras técnicas para guardar y recuperar datos en un archivo?

 

Si bien empleo Lazarus/CodeTyphon, creo que mis dudas son igualmente válidas tanto para Delphi como Lazarus.

 

Saludos,


  • 0

#2 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 02 abril 2015 - 06:30

Vamos a aclarar conceptos, la clausula "packed" no comprime los datos, simplemente cambiar la forma en como se organizan los datos en la memoria.

 

Por defecto los datos se alinean en multiplos de dos para que se pueda acceder a ellos de forma mas rapida.

 

Por ejemplo, si tenemos esto:


php
  1. var
  2. X: record
  3. B: byte;
  4. W: Word;
  5. end;
  6.  
  7. begin
  8. Writeln(SizeOf(x));

Veremos que nos muestra un 4, cuando el tamaño de un byte más un word es 3. Esto es debido a que los datos se alinean de tal forma que el primer byte este el posicion 0 y el word este el la posicion 2, dejando un byte sin utilizar en el medio. De esta manera, aunque desaprovechamos espacio en la memoria el acceso a los datos es mas rapido.

 

La directiva packed simplemente indica al compilador que no debe alinear los datos de ninguna manera, y que debe ponerlos uno a continuacion del otro elinando los espacios intermedios.

 

Por ejemplo:


php
  1. var
  2. X: packed record
  3. B: byte;
  4. W: Word;
  5. end;
  6.  
  7. begin
  8. Writeln(SizeOf(x));

Esto nos devuelve 3, y no cuatro como antes.

 

En cuanto a si se debe utilizar "packed" o no, pues depende:

  • Si se va a trabajar solo con los datos en memoria es indudable que el acceso a los datos es mucho mas rapido si no se usa.
  • Si se va a usar para leer/escribir en un fichero tiene la ventaja de que ocupa menos espacio.
  • Si se va usar para intercambiar informacion con otros programas (dlls, apis, etc ...) tendras que tener el mismo criterio, si ellos usan packed usarlo tu tambien, y si no lo usan no usarlo tu tampoco.

Saludos


  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 02 abril 2015 - 08:17

Umm. Ya voy entendiendo un poco más el funcionamiento de packed. Y esto me hace dudar de si al estar organizados de esa forma podré efectuar el volcado de datos de forma tan directa, o si habrá algún impedimento para acceder a cada elemento de un vector o matriz, de toda la vida con V[i], y M[i,j]. Sabiendo que algunas operaciones son del tipo algebraicas... y debo recorrer por filas y en otras por columnas.

 

A las estructuras (vectores y matrices) se las va a usar tanto para trabajar en memoria como para leer/almacenar datos en ficheros. Van a ser de grandes dimensiones así que seguro van a ocupar sus MB. Estoy pensando cual sería el enfoque más apropiado para cargar y guardar del/en fichero, y admito que todavía no he contemplado los pros y contras de las formas del formato de archivo:


php
  1. var
  2. DoubleFile: file of Double; // vs...
  3. DoubleFile: File;

He estado buscando algún documento o página que me aclare si es posible hacer un packed sobre arreglos dinámicos. No lo he probado si es posible, quise entender primero el concepto detrás de packed para luego ver (si es que se puede aplicarlo en arreglos dinámicos) si es viable la idea. Hasta ahora no he visto algo que diga que SI o NO... todo los ejemplos que he encontrado son para vectores de tamaño fijado como por ejemplo:


php
  1. TVectorFixed = packed array[1..MAX] of Double;

No se va a emplear para intercambiar datos con otros programas.

 

Te agradezco Domingo tu ayuda a aclararme las cosas.

 

Saludos,


  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 06 abril 2015 - 01:36

Al final he decidido no emplear packed. Preferí privilegiar el acceso a los datos que su espacio. Al final me terminaría complicando las cosas.

Lo que me queda por ver ahora son las formas de almacenar y recuperar los datos desde y hacia un archivo. Quizá sea más apropiado debatir este tema en otro hilo.

 

Saludos,


  • 0





Etiquetado también con una o más de estas palabras: packed, arrays, archivos

IP.Board spam blocked by CleanTalk.