1 #LyX 1.3 created this file. For more info see http://www.lyx.org/
11 \paperpackage widemarginsa4
15 \use_numerical_citations 0
16 \paperorientation portrait
19 \paragraph_separation indent
21 \quotes_language english
25 \paperpagestyle default
29 Organización de Datos (75.06)
34 \begin_inset Formula $\mu$
50 Leandro Lucarella (77891)
52 Ricardo Markiewicz (78226)
55 Primera Entrega, 19 de Abril de 2004
59 \begin_inset LatexCommand \tableofcontents{}
69 Esta es la documentación correspondiente a las API`s para el manejo de tres
70 organizaciones de archivo diferentes.
71 A continuación se describe cada una de ellas y su modo de funcionamiento
72 y sus características principales.
73 De la correcta elección de la organización, dependerá la eficiencia de
74 la aplicación que la utilice.
78 EMUFS se presenta como un
86 , capaz de administrar datos almacenados en cualquiera de las tres organizacione
87 s de archivo previamente mencionadas, las cuales a saberse son:
90 Registros de Longitud Variable, Bloques de tamaño parametrizable
93 Registros de Longitud Variable, Sin Bloques
96 Registros de Longitud Fija, Bloques de tamaño parametrizables
99 A través de este trabajo, se podrán observar las diferencias entre distintos
100 tipos de organización de archivos, ventajas y desventajas de cada una de
101 ellas, y las situaciones particulares que deberá sortear un filesystem,
102 como la partición de registros en distintos bloques, manejo de espacio
103 libre, compactación de un archivo, etc.
106 A continuación, veremos que el manejo de los archivos en EMUFS se realiza
107 a través de una estructura de control común para cualquier tipo de archivo,
108 dándole flexibilidad y escalabilidad a nuestro sistema.
111 Hacia el final de esta presentación, se observaran las pruebas realizadas
112 con las distintas organizaciones de archivos, y las conclusiones obtenidos
116 Documentación de la API
119 Para obtener una documentación de la API más completa, se incluye en formato
120 HTML en el CD-ROM la documentación generado con Doxygen.
121 Esta documentación se encuentra en el directorio
134 Se detallan a continuación los tipos de datos definidos y utilizados en
135 las distintas implementaciones que conforman nuestro sistema, siendo el
136 más importante de ellos, la estructura
140 que actúa como interfaz común para el manejo de cualquier tipo de archivo
141 (no importa que tipo de organización física posea un archivo, esta estructura
142 proveerá una interfaz (funciones) para su manejo).
148 En la implementación de cada tipo de organización física, así como también
149 en las API de los archivos auxiliares comunes a ellas, se da la utilización
150 de tipo definidos para una clara interfaz entre las mismas, los cuales
151 son brevemente descriptos a continuación y pueden ser hallados en el archivo
163 : usado para representar un
174 : usado para representar el tamaño en bytes de un registro.
181 : usado para representar un número de bloque.
188 : usado para representar el tamaño en bytes de un bloque.
195 : usado para representar espacio libre en bytes.
202 : usado para representar un offset.
222 es la estructura principal que encapsula todas las funciones para el manejo
223 de un archivo de datos.
224 Posee punteros a funciones que dependiendo de la organización física por
225 la cual se opte dentro del sistema, serán asignados de acorde.
229 Su declaración puede ser observada en el archivo
233 y la misma cuenta con los siguiente campos:
240 que es un tipo enumerado que indica cual es la organización.
247 indica el tamaño del bloque para los tipos 1 y 3.
254 indica el tamaño del registro, para el tipo 3 que posee tamaño constante.
261 puntero a la función para leer un bloque.
266 void *leer_bloque_raw()
268 puntero a la función para leer un bloque, el anterior y el siguiente.
273 void **leer_registro()
275 puntero a la función para leer un registro.
280 void **leer_registro_raw()
282 puntero a la función para leer un registro con su encabezado.
287 EMUFS_REG_ID *grabar_registro()
289 puntero a la función para grabar un registro.
294 EMUFS_REG_ID *modificar_registro()
296 puntero a la función para modificar un registro.
301 int *borrar_registro()
303 puntero a la función para borrar un registro.
308 EMUFS_Estadisticas *leer_estadisticas()
310 puntero a la función para cargar una estructura con las estadísticas.
317 puntero a la función para compactar un archivo.
324 almacena el nombre del archivo sin extensión.
327 Esta estructura define los valores de sus punteros según el tipo de organización
328 que se desee manejar y esto se realiza a través del API emufs, implementado
333 , que se describirá posteriormente.
336 Por ejemplo si se desea crear un archivo de nombre
337 \begin_inset Quotes eld
341 \begin_inset Quotes erd
344 organizado de la forma 3, se invoca a la función:
349 emufs_crear(filename,tipo,tam_bloque,tam_reg),
355 es el nombre que tendrán los archivos de datos e índice,
359 es el tipo de organización - bloques parametrizados y registros constantes
364 es el tamaño del bloque, y
368 es el tamaño del registro.
371 Para las diferentes organizaciones puede ser que alguno de estos 2 últimos
372 valores no tengan sentido almacenarlas y tomaran un valor por defecto igual
376 Según el tipo de organización, se inicializan los punteros a las funciones.
383 emufs_tipo3_leer_bloque()
385 , y lo mismo sucede con los demás.
395 es un tipo de dato enum, el cual será utilizado en la cabecera de todo
400 ), para indicar los distintos tipos de organización física.
401 Su declaración puede verse en el archivo
406 A saberse los valores y significado correspondiente que puede tomar este
414 : Archivos con registros de longitud variable y bloques parametrizables.
421 : Archivos con registros de longitud variable sin bloques.
428 : Archivos con registros de longitud fija y bloques parametrizables.
438 es una estructura que almacenará los datos pertinentes a las estadísticas
439 de un archivo dado, y será utilizada para visualizar dichas observaciones
443 Su declaración puede ser observada en el archivo
447 y la misma cuenta con los siguiente campos:
458 : indica el tamaño del archivo de datos (.dat) en bytes.
469 : indica el tamaño de los archivos auxiliares sumados en bytes.
480 : indica la cantidad de bytes en información de control utilizados para
492 : promedio de espacio libre en el archivo de datos (por bloque o gap promedio
504 : total de espacio libre en el archivo de datos.
515 : máximo espacio libre en el archivo de datos (en un bloque o máximo gap
538 : cantidad de bloques en el archivo de datos (.
553 : cantidad de registros en el archivo de datos (
560 En base a la estructura descripta anteriormente y mediante la utilización
561 de la función de lectura de estadísticas
563 emufs_leer_estadisticas()
565 disponible en la estructura común
569 handler de cualquier tipo de archivo, podremos obtener una serie de estadística
570 s que pasamos a detallar (más allá de los datos básicos como cant registros,
571 cant bloques, tam archivo, etc):
574 Relación entre espacio libre y el tamaño del archivo de datos (
581 Relación entre el espacio ocupado por información de control y el tamaño
582 del archivo de datos (
589 Cantidad promedio de espacio libre (en bloque o gap promedio)
592 Desviaciones extremas de espacio libre (máximo/mínimo espacio libre en bloque
597 \begin_inset LatexCommand \label{sec:cabecera_gral}
601 Organización física general de un archivo E
602 \begin_inset Formula $\mu$
609 \begin_inset Formula $\mu$
612 FS está compuesto por 4 archivos a nivel de sistema operativo: archivo de
613 datos (con 3 formatos posibles, ver páginas
614 \begin_inset LatexCommand \pageref{cha:tipo1}
619 \begin_inset LatexCommand \pageref{cha:tipo2}
624 \begin_inset LatexCommand \pageref{cha:tipo3}
628 ), archivo de índice (ver página
629 \begin_inset LatexCommand \pageref{sec:idx}
633 ), archivo de control de espacio libre (ver página
634 \begin_inset LatexCommand \pageref{sec:fsc}
638 ) y archivo de índices recuperables (ver página
639 \begin_inset LatexCommand \pageref{sec:did}
646 El archivo de datos está compuesto por:
657 (4 bytes en plataformas Linux de 32 bits) que representa el tipo de archivo.
660 Datos dependientes del tipo de archivo.
667 es utilizada para poder detectar el formato de un archivo al abrirlo.
668 Los datos dependientes del tipo de archivo serán explicados en sus secciones
675 +-----------+--------------------------------------------//-+
678 | tipo | Datos dependientes del tipo de archivo ...
686 +-----------+--------------------------------------------//-+
692 Uso de la estructura EMUFS
695 Como fue mencionado anteriormente en la descripción de la estructura EMUFS,
696 la misma proporciona al usuario una interfaz a través de la cual puede
697 realizar el manejo de archivos en forma genérica, abstrayéndose del tipo
698 de organización física en particular que dicho archivo posea.
703 y las funciones que inicializan la estructura se encuentran en
708 Es decir que a través de esta estructura, podemos manejar cualquier tipo
709 de archivo, mediante una misma interfaz en común.
714 posee además de ciertos datos que describen la organización física de un
715 archivo dado como por ejemplo
733 , una serie de punteros a funciones para el manejo del archivo del cual
737 Entre dichos funciones se encuentran:
743 leer_bloque(), borrar_registro()
751 modificar_registro, leer_estadisticas()
758 Para entender mejor el uso de esta estructura para el manejo de los archivos,
759 mostraremos un ejemplo concreto.
760 Supongamos que tenemos el siguiente código:
763 EMUFS *efs = emufs_crear(¨articulos.dat¨,T3,200,50);
766 Esto hará que se cree el archivo de datos
770 , con la organización física tipo 3 con registros de longitud fija de 50
771 bytes y bloques de 200 bytes.
772 Al mismo tiempo, los se asignaran valores a los punteros a funciones que
773 posee dicha estructura, la cual de ahora en más estará en condiciones de
774 manejar un archivo del tipo 3.
775 Gráficamente lo que sucede es:
779 \begin_inset Float figure
786 Inicialización de estructura EMUFS para un caso Archivo Tipo 3
790 \begin_inset Graphics
791 filename graphics/Emufsinit.png
803 Así pues, cuando se utilice la estructura para por ejemplo leer un registro,
804 sucederá lo siguiente:
807 efs->leer_registro(params) -- calls --> emufs_tipo3_leer_registro(params)
810 Como se puede observar, la estructura
814 permitirá el manejo de cualquier tipo de archivo, a través del mismo código,
815 dándole gran flexibilidad a nuestro sistema, que podrá expandirse a más
816 tipos de archivos de ser necesario.
822 Acompañando al archivo de datos (
826 ) el cual es responsable de la contención de los registros, tendremos tres
827 archivos auxiliares (
839 ) cuya funcionalidad y propósito pasamos a describir a continuación, sin
840 antes remarcar que los tres archivos poseen una sola implementación para
841 las distintas formas de organización física que hemos implementado (tres
842 para ser mas exactos).
845 Entre las ventajas de poseer la misma implementación se encuentra el tener
846 un API común entre los tres tipos para el manejo de la localización de
847 sus registros, administración de espacio libre e Id's liberados, sin necesidad
848 de realizar n-implementaciones para un mismo objetivo final.
851 Además, la obtención de ciertos datos estadísticos como espacio libre, o
852 cantidad de registros, se realiza a través de la misma interfaz, y también
853 se ha facilitado en cierto grado la re-organización física de un archivo
854 (pasar de un tipo a otro), dado el uso de estos tres archivos auxiliares
855 en común para funciones tan predominantes como índexación, administración
856 de espacio libre y recuperación de Id's.
860 \begin_inset LatexCommand \label{sec:idx}
867 El archivo índice (.idx), permite la localización de los registros en el
868 .DAT de forma directa, mediante la obtención de su offset respecto del inicio
869 del .dat, o nro bloque (segun el tipo de organización física) en donde se
870 encuentra un registro dado, indicado por su
875 Los registros de este archivo se encuentran representados una estructura
876 que indica un número de registro y el bloque u offset en donde se encuentra
880 Es necesario que este archivo esté ordenado por
884 , ya que esto permitirá el acceso directo al mismo, para la rápida obtención
885 del nro de bloque u offset y posterior búsqueda de un registro en el archivo
892 Los registros de este archivo se encuentran representados a nivel código
893 por el siguiente tipo de dato interno (
900 typedef struct emufs_idx_t {
906 EMUFS_OFFSET location;
913 \begin_inset Float table
920 Ejemplo de registro en archivo índice (.idx), para un archivo de organización
926 <lyxtabular version="3" rows="2" columns="3">
928 <column alignment="center" valignment="top" leftline="true" width="0">
929 <column alignment="center" valignment="top" leftline="true" width="0">
930 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
931 <row topline="true" bottomline="true">
932 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
940 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
948 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
956 <row topline="true" bottomline="true">
957 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
965 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
973 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
978 Indica que el registro de id_reg = 5, se encuentra en el bloque 54
990 \begin_inset Float table
997 Ejemplo de registro en archivo índice (.idx), para un archivo de organización
1002 \begin_inset Tabular
1003 <lyxtabular version="3" rows="2" columns="3">
1005 <column alignment="center" valignment="top" leftline="true" width="0">
1006 <column alignment="center" valignment="top" leftline="true" width="0">
1007 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
1008 <row topline="true" bottomline="true">
1009 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1017 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1025 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1033 <row topline="true" bottomline="true">
1034 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1042 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1050 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1055 Indica que el registro de id_reg = 5, se encuentra en el bloque 54
1075 Como se puede observar, para distintas organizaciones el significado de
1076 los registros en este archivo es diferente y se utilizará de distinta manera
1083 Las declaraciones e implementación se pueden encontrar en
1097 \labelwidthstring 00.00.0000
1105 Los registros del archivo índice (
1109 ), poseen una correspondencia 1 a 1, con los Id's de los registros en el
1115 Con esto, queremos decir que el N-ésimo registro del archivo índice, será
1116 aquél que posea la información para localizar al registro cuyo
1120 es N, dentro del archivo de datos (
1130 Cabe aclarar que por si bien el índice se encuentra ordenado por
1134 , los registros en el archivo de datos, por lo general no lo estarán (ordenados
1140 emufs_idx_buscar_registro(), emufs_idx_get()
1142 \labelwidthstring 00.00.0000
1148 Ante la alta de un registro en el archivo de datos, se insetará un nuevo
1149 registro en el archivo índice, con el id_reg del registro en cuestión,
1150 y el offset u bloque donde se lo haya grabado en disco.
1156 \labelwidthstring 00.00.0000
1162 Ante el borrado de un registro del archivo de datos, se accederá el registro
1163 correspondiente en el índice, y se actualizara su LOCATION, estableciéndolo
1164 en el valor especial
1168 , el cual indica que ese registro ha sido eliminado y por ende no se lo
1169 podrá localizar en el futuro.
1170 Como se verá mas adelante, según el tipo de organización física, el registro
1171 puede ser borrado concretamente del .
1182 \labelwidthstring 00.00.0000
1188 Ante la modificación en la posición física de un registro dentro del archivo
1189 de datos (por ejemplo luego del proceso de re-compactación, se realizará
1190 la modificación respectiva del campo
1198 emufs_idx_actualizar()
1202 \begin_inset LatexCommand \label{sec:fsc}
1206 Archivo de control de espacio libre
1209 El archivo de espacio libre (
1213 ) (espacio por bloque o gaps en archivo, según el tipo de organización física),
1214 tiene como función la administración del espacio libre, generado por previas
1215 eliminaciones de registros en el archivo de datos.
1216 El mismo, nos indicará donde hay lugar para insertar un nuevo registro.
1219 Para el caso de una organización por bloque, nos dirá en que bloque o si
1220 se debe generar un nuevo bloque.
1221 En el caso de la organización sin bloques, nos indicará en que gap o si
1222 al final del archivo.
1225 Los registros de este archivo se encuentran representados una estructura
1226 que indica un número de bloque u offset y el espacio libre disponible en
1227 el mismo (o a partir del mismo en el caso del offset).
1234 : Por requerimiento del algoritmo de compactación el tipo de organización
1235 física con reg long var, sin bloques, los gaps se graban en forma ordenada
1237 (El orden se corresponde con lo que hay en el .dat).
1243 Los registros de este archivo se encuentran representados a nivel código
1244 por el siguiente tipo de dato interno (
1251 typedef struct emufs_fsc_t {
1254 EMUFS_BLOCK_ID marker;
1257 EMUFS_FREE freespace;
1267 \begin_inset Float table
1274 Ejemplo de registro en archivo de control de espacio libre para un archivo
1279 \begin_inset Tabular
1280 <lyxtabular version="3" rows="2" columns="3">
1282 <column alignment="center" valignment="top" leftline="true" width="0">
1283 <column alignment="center" valignment="top" leftline="true" width="0">
1284 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
1285 <row topline="true" bottomline="true">
1286 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1294 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1302 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1310 <row topline="true" bottomline="true">
1311 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1319 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1327 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1332 Indica que en el bloque 12, hay 120 bytes libres al final del mismo.
1344 \begin_inset Float table
1351 Ejemplo de registro en archivo de
1355 para un archivo sin bloques
1359 \begin_inset Tabular
1360 <lyxtabular version="3" rows="2" columns="3">
1362 <column alignment="center" valignment="top" leftline="true" width="0">
1363 <column alignment="center" valignment="top" leftline="true" width="0">
1364 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
1365 <row topline="true" bottomline="true">
1366 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1374 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1382 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1390 <row topline="true" bottomline="true">
1391 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1399 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1407 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1412 Indica que a partir del byte 12 del archivo de datos, hay 120 bytes libres.
1432 Como se puede observar, para distintas organizaciones el significado de
1433 los registros en este archivo es diferente y se utilizará de distinta manera
1437 Funciones principales
1440 Las declaraciones e implementación se pueden encontrar en
1454 \labelwidthstring 00.00.0000
1460 Ante la operación de alta de un registro en el archivo de datos, se realizará
1461 la búsqueda de espacio libre donde este podrá ser insertado.
1462 En el caso de organizaciones con bloques, se buscará en que
1466 se posee espacio suficiente para albergar el nuevo registro (o a partir
1475 bloques consecutivos libres).
1476 En el caso de organización sin bloque, se buscará un gap o espacio libre
1477 en el archivo, obteniéndose en consecuencia, el
1486 emufs_fsc_buscar_lugar(), emufs_fsc_buscar_n_lugares()
1488 \labelwidthstring 00.00.0000
1494 Luego de una operación de baja o alta de un registro en el archivo de datos
1499 ), incrementará o decrementará respectivamente el espacio libre en el archivo
1500 de datos, y esto deberá ser registrado, agregando un nuevo registro en
1501 el archivo de espacios libres (
1505 ) o bien modificándolo.
1509 En el caso de organizaciones con bloques, se actualizará el valor del espacio
1514 en el bloque (ya sea incrementándolo o decrementándolo) o bien se insertará
1515 un nuevo registro en caso de que se esté creando un nuevo bloque en el
1516 archivo de datos (en este caso no será debido a un alta o baja de registro
1517 como se mencionó al principio).
1521 Para el caso de organización sin bloques, en el caso de baja de un registro
1526 ) se insertará un nuevo registro en el
1530 dando cuenta de la aparición de un nuevo gap en el archivo de datos (
1534 ), y en caso de estar este lindante con otro gap, se realizará el merge
1536 (esto esta explicado más en profundidad en los casos particulares de organizaci
1537 ón física, registros variables sin bloques).
1538 Para el caso de una alta en el archivo de datos (
1542 ), el valor del gap donde se haya insertado se actualizará.
1547 emufs_fsc_agregar(), emufs_fsc_agregar_gap(), emufs_fsc_actualizar(), emufs_fsc_
1550 \labelwidthstring 00.00.0000
1556 : Únicamente para el caso de una organización que presente gaps en el archivo,
1557 se podrá dar a lugar la eliminación de un registro del archivo de espacios
1563 Esta situación tendrá efecto cuando se inserte un registro que entre perfecto
1564 en un gap disponible, y por ende el gap desaparecerá.
1568 emufs_fsc_borrar_gap()
1572 \begin_inset LatexCommand \label{sec:did}
1576 Archivo de id's recuperables
1579 El archivo de Id's liberado (
1583 ) llevará cuenta de aquellos Id's de registros (
1587 ) que ya no se encuentran siendo utilizados y fueron liberados por registros
1588 eliminados previamente.
1589 A través del mismo, se podrá realizar la reutilización de Id's ante la
1590 alta de nuevos registros.
1593 A nivel físico, este archivo poseerá una secuencia de datos del tipo EMUFS_REG_I
1594 D, y el comportamiento del sistema de recuperación de Id's será el de una
1596 Es decir, ante el requerimiento de un
1600 libre por una función del sistema como por ejemplo la alta de un nuevo
1601 registro, el API del archivo (
1605 ), obtendrá el último dato del mismo (el
1609 que fue liberado mas recientemente), y truncará el archivo eliminando el
1614 recuperado de la tabla.
1615 (LIFO, Last in First Out).
1621 Este archivo tiene registros de un solo campo,
1625 el cual simboliza al id que fue liberado en un proceso de baja de registros.
1628 Funciones principales
1631 Las declaraciones e implementación se pueden encontrar en
1645 \labelwidthstring 00.00.0000
1651 Ante la eliminación de un registro del archivo de datos (
1655 ) se procederá al agregado del correspondiente
1659 que fue liberado por dicha operación, al archivo
1673 \labelwidthstring 00.00.0000
1679 Cuando el sistema desee grabar un nuevo registro en el archivo de datos,
1684 disponible para el mismo.
1685 El sistema de administración de Id's libres, obtendrá el último
1689 que se guardó en el archivo (o se eliminó del archivo de datos), y truncará
1690 el archivo eliminándolo.
1698 emufs_did_get_last()
1702 \begin_inset LatexCommand \label{cha:tipo1}
1706 Archivo con bloques parametrizados y registros de longitud variable
1709 Este tipo de archivo tiene varias complicaciones, al tratarse de un punto
1711 \begin_inset LatexCommand \ref{cha:tipo2}
1716 \begin_inset LatexCommand \ref{cha:tipo3}
1720 (cuenta tanto con bloques como con registros variables), hereda los inconvenien
1721 tes (y ventajas) de ambos, más los propios.
1722 Al implementar este tipo de archivo se puso énfasis en la eficiencia mientras
1723 esta no comprometa la mantenibilidad del código, es por esto que en algunas
1724 circunstancias no se hace un uso óptimo del espacio.
1727 La implementación de este tipo de archivo puede ser encontrada en
1731 mientras que su interfaz pública está disponible en
1741 El archivo está compuesto por la
1746 \begin_inset LatexCommand \pageref{sec:cabecera_gral}
1751 El valor que toma en este tipo de archivo es 0 (o el valor simbólico
1760 Luego le sigue una cabecera propia del archivo (un
1764 , 4 bytes) que almacena el tamaño del bloque que usa el archivo.
1765 De esta manera, al abrir un archivo de este tipo no se necesita tener ninguna
1766 información sobre él.
1767 A esta cabecera le siguen cero o más bloques del tamaño fijo especificado
1768 en la cabecera antes mencionada.
1774 +-----------+-----------+------------------------//-+
1777 | tipo | tam_bloque| Cero o más bloques ...
1785 +-----------+-----------+------------------------//-+
1788 /- 4 bytes -/- 4 bytes -/
1791 Organización física de un bloque
1794 Cada bloque no guarda información en sí, sólo se comporta como un contenedor
1796 Esto no significa que un bloque no tenga utilidad, el bloque es utilizado
1797 para proveer un acceso semi-aleatorio a los registros.
1798 Para esto se utiliza el archivo de índice (ver página
1799 \begin_inset LatexCommand \ref{sec:idx}
1803 ), que almacena pares [identificador de registro, número de bloque].
1804 Para que sea suficiente este único índice para hallar un registro (siendo
1805 que puede haber más de un registro por bloque), es necesario
1807 alinear los registros a izquierda
1810 Esto significa que hay que asegurar que siempre los registros en un bloque
1811 se presenten de forma consecutiva, jamás permitiendo que haya un espacio
1812 libre entre registros (en un mismo bloque).
1815 Podemos ver un ejemplo de esto en forma gráfica:
1818 bloque N-1 | bloque N | bloque N+1
1821 /----------+------------+------------+---------------+-----------/
1826 | registro 1 | registro 2 | espacio libre |
1831 /----------+------------+------------+---------------+-----------/
1834 /------------- tamaño del bloque ---------/
1837 De esta forma, una vez obtenido el número de bloque, se pueda recorrer secuencia
1838 lmente hasta encontrar el registro deseado.
1839 A fin de llevar el conteo de espacio libre se utiliza el archivo de control
1840 de espacio libre (ver página
1841 \begin_inset LatexCommand \ref{sec:fsc}
1845 ), de forma tal que no sea necesario recorrer secuencialmente en busca de
1846 espacio libre al hacer una inserción.
1849 Puede darse un caso excepcional en el que un registro sea más grande que
1850 un bloque, en este caso el registro se almacenará en N bloques consecutivos
1851 (siendo N la cantidad de bloques que necesita el registro), ocupando completos
1852 los todos los bloques a excepción del último, en el que posteriormente
1853 se pueden agregar más registros.
1854 \layout Subsubsection
1857 \begin_inset LatexCommand \label{sub:tipo1_reg}
1861 Organización física de un registro.
1864 El registro es el que representa al dato realmente que se quiere almacenar.
1865 Para representar ese dato se necesita una determinada información de control,
1866 tanto para poder identificar el registro en un bloque (en búsquedas secuenciale
1867 s dentro del bloque) como para saber su longitud (dado que este tipo de
1868 archivo utiliza registros de tamaño variable).
1871 Siguiendo la metodología general de E
1872 \begin_inset Formula $\mu$
1875 FS, se optó por incluir esta información de control como una cabecera al
1876 comienzo del registro, siguiendo a esta los datos en sí.
1877 La cabecera está compuesta por un identificador (
1881 ) de registro (EMUFS_REG_ID, 4 bytes) seguido por el tamaño (
1885 ) del registros (EMUFS_REG_SIZE, 4 bytes).
1886 Podemos ver gráficamente como se se compone un registro:
1892 +-----------+-----------+------------------+
1895 | id | tamaño | datos ...
1899 +-----------+-----------+------------------+
1902 /- 4 bytes -/- 4 bytes -/- [tamaño] bytes -/
1903 \layout Subsubsection
1906 \begin_inset LatexCommand \label{sub:tipo1_reg_multi}
1910 Organización física de un registro más grande que un bloque (registro
1917 Puede darse el caso excepcional en que un registro sea de mayor longitud
1919 Al ser una situación excepcional, no siempre se resuelve de la forma más
1920 eficiente ni se minimiza el espacio ocupado por datos de control (como
1921 se dijo anteriormente, se prefirió conservar la simpleza del código, adoptando
1922 algoritmos generales aunque no sea de la forma más eficiente o maximizando
1923 el uso del espacio para no perjudicar la mantenibilidad).
1926 Para manejar un registro
1930 se optó por limitarlo a la siguiente estructura (suponiendo que el registro
1931 ocupa N bloques, con N > 1 y que un
1935 es una porción del registro que entra en un bloque):
1942 se almacenan en bloques completos consecutivos.
1945 El último fragmento se almacena al comienzo del bloque inmediatamente posterior
1949 Cada fragmento posee las cabeceras mencionadas en la sección
1950 \begin_inset LatexCommand \ref{sub:tipo1_reg}
1954 , cuyo contenido es el siguiente:
1962 se almacena el identificador único obtenido al hacer el alta.
1969 se almacena el tamaño del
1973 actual más los tamaños de los
1977 posteriores, quedando en el primer
1981 el tamaño completo del registro y en el último sólo el tamaño del
1989 Como puede observarse, la información de control en los
1993 intermedios puede ser redundante, pero se conserva para poder realizar
1994 algoritmos genéricos (que se basan en que al principio de un bloque, si
1995 no está vacío, hay una cabecera de un registro) y para facilitar chequeos
1996 de integridad del archivo.
1999 A continuación se presenta un ejemplo gráfico de un registro multibloque
2000 de 10 bytes (de contenido
2001 \begin_inset Quotes eld
2005 \begin_inset Quotes erd
2008 ) almacenado en un archivo con bloques de 12 bytes (4 para datos):
2011 | bloque 0 | bloque 1 | bloque 2
2014 +-------------------+-------------------+-------------------+-//-+
2017 | registro 0 - 1/3 | registro 0 - 2/3 | registro 0 - 3/3..|
2024 |+----+-----+------+|+----+-----+------+|+----+-----+----+..| // |
2027 || id | tam | datos||| id | tam | datos||| id | tam |dato|..|
2034 ||----+-----+------+||----+-----+------+||----+-----+----+..| // |
2037 || 0 | 10 | 1234 ||| 0 | 6 | 5678 ||| 0 | 2 | 90 |..|
2044 |+----+-----+------+|+----+-----+------+|+----+-----+----+..| // |
2047 +-------------------+-------------------+-------------------+-
2057 2 bytes libres al final del bloque 2
2060 Este es un ejemplo figurativo, ya que se puso como límite mínimo de tamaño
2061 de bloque 16 bytes (para que haya al menos la misma cantidad de espacio
2062 para datos que para información de control).
2063 Este límite mínimo ya roza lo absurdo (es muy ineficiente por la gran cantidad
2064 de accesos a disco que necesita).
2065 El límite físico es de 9 bytes (8 para información de control, 1 para datos).
2068 Funciones principales
2071 Las funciones principales son las necesarias para completar la estructura
2073 \begin_inset LatexCommand \pageref{sub:EMUFS}
2080 Lectura de registros
2083 Para leer un registro se hace uso del archivo de índice (ver página
2084 \begin_inset LatexCommand \pageref{sec:idx}
2088 ), obteniéndose el número de bloque en donde está almacenado el registro
2090 Una vez obtenido, se carga en memoria el bloque entero y se busca secuencialmen
2091 te en él (leyendo la cabecera de cada registro y salteando los datos) hasta
2092 encontrar el registro pedido.
2093 Una vez encontrado se lo copia y devuelve.
2096 Si se tratara de un registro
2101 \begin_inset LatexCommand \ref{sub:tipo1_reg_multi}
2105 ), se procede forma similar, sólo que se cargan en memoria uno a uno los
2106 bloques que componen el registro y se van copiando (y uniendo) los
2115 emufs_tipo1_leer_registro()
2121 Para realizar el alta de un registro, lo primero que se obtiene es un identifica
2122 dor, buscando primero en el archivo de identificadores recuperables (pág.
2124 \begin_inset LatexCommand \ref{sec:did}
2128 ) y de no haber ninguno, buscando el mayor identificador presente en el
2129 archivo de índice (pág.
2131 \begin_inset LatexCommand \ref{sec:idx}
2136 El paso siguiente es buscar un bloque con espacio libre suficiente como
2137 para almacenar el registro (y su cabecera) en el archivo de control de
2140 \begin_inset LatexCommand \ref{sec:fsc}
2144 ) y cargarlo completo en memoria.
2145 De no encontrarse, se crea un bloque nuevo al final de archivo.
2146 En el bloque cargado en memoria, se agrega el registro nuevo (con su cabecera)
2147 al comienzo del espacio libre (calculado a partir del tamaño del bloque
2148 y el espacio libre en bloque) y se lo graba en disco.
2149 Finalmente se agrega (o actualiza) el identificador al archivo índice y
2150 el espacio libre en el bloque.
2153 Si el registro ocupara más de un bloque (ver sección
2154 \begin_inset LatexCommand \ref{sub:tipo1_reg_multi}
2158 ), se buscan N bloques consecutivos (todos los que necesite el registro)
2159 absolutamente libres
2165 Incluso el último bloque debe estar absolutamente libre para cumplir con
2166 las condiciones presentadas en la sección
2167 \begin_inset LatexCommand \ref{sub:tipo1_reg_multi}
2174 y graba bloque a bloque cada
2178 del registro (con sus cabeceras intermedias), al último
2182 se lo trata de forma análoga a un registro
2187 Por cada bloque utilizado se actualiza el archivo de control de espacio
2193 emufs_tipo1_agregar_registro()
2199 Al eliminar un registro lo primero que se hace es actualizar los archivos
2200 de índice y de identificadores recuperables, poniendo como número de bloque
2205 y agregando el identificador del registro a borrar respectivamente.
2206 También se actualiza el archivo de control de espacio libre por cada bloque
2207 (en caso de ser más de uno, en registros
2211 , se actualizan todos los bloques) y se carga el bloque en memoria para
2214 alinear los datos a izquierda
2216 (en caso de ser un registro
2220 , esto se realiza sólo para el último bloque).
2221 Para alinear los datos, se recorre secuencialmente en bloque (leyendo la
2222 cabecera de cada registro y salteando los datos) hasta encontrar el registro
2224 Encontrado el registro, se copian todos los bytes que se encuentran entre
2225 el fin del registro a borrar y el fin del bloque, en el comienzo del bloque
2231 emufs_tipo1_borrar_registro()
2234 Modificación de registros
2237 Se optó por un algoritmo simple y general, que usa las funciones de alto
2238 nivel mencionadas hasta ahora.
2239 Simplemente borra el registro y vuelve a crearlo.
2240 Al recuperar el último identificador de registro borrado, nos aseguramos
2241 de que se mantenga el identificador del registro.
2246 emufs_tipo1_modificar_registro()
2249 Obtención de estadísticas
2252 Es una función bastante simple, con una única complicación que mencionaremos
2256 Para obtener las máximas desviaciones, cantidad total de espacio libre,
2257 cantidad de registros y tamaño de los archivos auxiliares se utilizan las
2258 funciones apropiadas de los archivos auxiliares (ver secciones
2259 \begin_inset LatexCommand \ref{sec:idx}
2264 \begin_inset LatexCommand \ref{sec:fsc}
2269 \begin_inset LatexCommand \ref{sec:did}
2276 Para obtener la cantidad de bloques se hace el siguiente calculo:
2279 cant_bloques = (tamaño_archivo_datos - tamaño_cabecera_archivo_datos)
2285 Hasta aquí no hay mayores inconvenientes.
2286 El problema se presenta para calcular el tamaño de la información de control
2287 utilizada por el archivo de datos; se utiliza el siguiente cálculo:
2290 tam_info_control_datos = tamaño_cabecera_archivo_datos
2293 + cant_registros * tamaño_cabecera_registro;
2296 Aunque a simple vista esto parece acertado, no contempla el caso de los
2302 \begin_inset LatexCommand \pageref{sub:tipo1_reg_multi}
2306 ), estos registros almacenan
2308 tamaño_cabecera_registro * N
2314 es la cantidad de bloques que ocupan.
2315 Salvar este caso sería muy costoso, porque habría que recorrer el archivo
2316 registro a registro,
2324 e ir contando todas las cabeceras de registro que aparecen (similar a lo
2325 que se hace en la compactación, ver sección
2326 \begin_inset LatexCommand \ref{sub:tipo1_compact}
2331 Al tratarse este de un caso excepcional, se optó por mantener la función
2332 simple ya que funciona bien en la mayoría de los casos.
2337 emufs_tipo1_leer_estadisticas()
2341 \begin_inset LatexCommand \label{sub:tipo1_compact}
2345 Compactación del archivo de datos
2348 Esta función es una de las más simples, porque se limita a un algoritmo
2349 muy simple que utiliza las funciones de
2353 antes nombradas para realizar su tarea.
2354 Básicamente recorre el archivo de índices de registros, de comienzo a fin,
2355 leyendo el registro, borrándolo y volviéndolo a insertar.
2356 Si había espacio libre en un bloque anterior al que estaba, será insertado
2357 en él, si no volverá a grabarse en el lugar en que estaba.
2358 De esta forma se aprovechan todos los espacios libres intermedios, concluyendo
2359 con un archivo igual o más pequeño que el original.
2362 Esta implementación no es la más eficiente, pero siendo que esta es una
2363 operación costosa y excepcional por naturaleza, se optó por mantener el
2364 algoritmo simple a costo de un poco de eficiencia.
2369 emufs_tipo1_compactar()
2373 \begin_inset LatexCommand \label{cha:tipo2}
2377 Archivo sin bloques y registros de longitud variable
2380 Este tipo de archivo nos traerá a la mesa la particularidad de grabar registros
2381 de longitud variable sin realizar su agrupación en bloques, y como veremos
2382 en la siguiente sección, también permitirá la administración de gaps que
2383 queden en el archivo luego de operaciones de baja de registros.
2389 Este tipo de archivo realizará el almacenamiento de registros de longitud
2390 variable en disco, su borrado y modificación sin la utilización de bloques
2392 Su implementación se encuentra en los archivos fuente (
2403 Los archivos del tipo 2, presentarán al comienzo del mismo un header compuesto
2404 simplemente por un dato del tipo EMUFS_Tipo (int) el cual indicará el tipo
2405 de archivo en cuestión.
2408 Para poder entender mejor la organización física de este tipo de archivo,
2409 tomemos el caso hipotético en el que se encuentran grabados
2413 (comenzando desde registro 0) de
2422 Supongamos también que entre el registro 0 y 1 se encontraba un
2424 registro de 10 bytes
2439 Si miramos al archivo de datos (.dat) en el disco nos encontraremos con
2441 \begin_inset Float figure
2448 Organización física de los registros en disco
2452 \begin_inset Graphics
2453 filename graphics/Example1.png
2464 Como se puede observar, a nivel físico cada registro grabado esta compuesto
2465 por un Header cuyo tamaño total es de 8 bytes (
2473 ), y posteriormente el registro (bloque de datos) en sí.
2474 Luego se encuentra el espacio libre de 18 bytes dejado por el registro
2475 de 10 bytes eliminado (10 bytes de datos + header de 8 bytes) y finalmente
2476 el segundo registro mencionado.
2479 Comportamiento Particular de los Archivos Auxiliares
2482 Como fue explicado al inicio de la documentación, la implementación de cualquier
2483 a de las tres organizaciones físicas de archivos presenta la necesidad de
2484 poseer tres archivos auxiliares que actuarán como índice de direcciones
2489 ), administrador de espacio libre (
2493 ) y administrador de Id's liberados (
2500 No obstante, cada tipo de organización presentara sus particularidades respecto
2501 de estos tres archivos, las cuales describiremos a continuación en caso
2503 \layout Subsubsection
2505 Archivo índice o de posiciones relativas (.idx)
2512 ), permite la localización de los registros en el .DAT de forma directa,
2513 mediante la obtención de su offset o posición relativa respecto del inicio
2518 en donde se encuentra un registro dado, indicado por su ID.
2521 Así pues, si tomamos el ejemplo descripto al inicio de este capítulo, tendremos
2522 las siguientes entradas en el archivo índice
2527 \begin_inset Float table
2534 Organización física del archivo de índice o posiciones relativas.
2538 \begin_inset Tabular
2539 <lyxtabular version="3" rows="3" columns="3">
2541 <column alignment="center" valignment="top" leftline="true" width="0">
2542 <column alignment="center" valignment="top" leftline="true" width="0">
2543 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
2544 <row topline="true" bottomline="true">
2545 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2555 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2565 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2573 <row topline="true">
2574 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2584 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2594 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2599 El primer registro (reg0) comienza en el byte 4
2603 <row topline="true" bottomline="true">
2604 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2612 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2622 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2627 El segundo registro (reg1) comienza en el byte 60
2647 LOCATION indica donde comienza el header del registro buscado, y por consiguien
2648 te luego del header tendremos el registro en sí (los datos).
2649 \layout Subsubsection
2651 Archivo de Gaps / Espacios Libres (.fsc)
2654 El archivo de espacios libres o gaps (.fsc), tiene como función la administración
2655 del espacio libre o gaps (agujeros), generados por previas eliminaciones
2656 de registros en el archivo de datos.
2657 El mismo, nos indicará donde hay lugar para insertar un nuevo registro
2658 (se podrán insertar en algún gap acorde, o bien al final del archivo).
2659 Este archivo será utilizado también para el proceso de compactación de
2660 un archivo, explicado luego.
2663 Así pues, si tomamos el ejemplo descripto al inicio del documento, tendremos
2664 las siguientes entradas en el archivo índice
2669 \begin_inset Float table
2676 Organización física del archivo de
2680 o control de espacio libre.
2684 \begin_inset Tabular
2685 <lyxtabular version="3" rows="2" columns="3">
2687 <column alignment="center" valignment="top" leftline="true" width="0">
2688 <column alignment="center" valignment="top" leftline="true" width="0">
2689 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
2690 <row topline="true" bottomline="true">
2691 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2701 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2711 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2719 <row topline="true" bottomline="true">
2720 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2730 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2740 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2745 18 bytes libres a partir del byte 42 del .dat
2765 Por requerimiento del algoritmo de compactación, los gaps se graban en
2766 forma ordenada en el (.fsc).
2767 (El orden se corresponde con lo que hay en el
2772 \layout Subsubsection*
2777 Si bien la utilización concreta de los GAPS será explicada posteriormente
2778 en la ALTA y BAJA de registros, debemos remarcar la funcionalidad de MERGING
2779 que posee nuestro sistema FSC.
2782 Ante la eliminación de un registro del archivo de datos, se generara por
2783 consiguiente un gap o espacio libre en alguna posición del archivo.
2784 Ese gap deberá ser registrado en el archivo de gaps (.fsc).
2785 Ahora bien, nuestro sistema de gaps, contemplará como es debido, la posibilidad
2786 de que se haya eliminado un registro que posee un GAP por delante, un GAP
2787 por detrás, o bien un GAP por delante y por detrás del mismo.
2790 Nuestro sistema actuará en consecuencia, realizando un merge de los espacios
2791 libres, y unificándolos en una ÚNICA entrada en el archivo .fsc, que contendrá
2792 como dato de freespace, la suma correspondiente de los espacios libres
2794 \layout Subsubsection
2796 Archivo de ID's liberados (.did)
2799 El archivo de ID's liberados no presenta ningún aspecto particular en este
2800 tipo de organización.
2801 Remitirse al capítulo correspondiente a los archivos auxiliares para consultar
2802 su estructura y funcionamiento.
2805 Funciones Principales
2820 se encuentran las cabeceras y la implementación de las funciones principales
2821 respectivamente, las cuales dan funcionalidad a esta organización.
2825 A continuación se comentará el funcionamiento algunas de las mas importantes.
2828 Lectura de registros
2831 Como se vio al comienzo, los registros en este tipo de archivo no se encuentran
2832 agrupados en bloques de ninguna índole y están dispersos a lo largo del
2833 archivo, con la particularidad de que pueden existir gaps o espacio libre,
2834 entre dos registros dados.
2837 Por ende la lectura de registros en este tipo de organización es muy simple
2838 y dada la inexistencia de bloques, el procedimiento será el siguiente:
2841 Se determina el offset en bytes, donde comienza el registro deseado, a través
2842 de su ID, buscando la misma en el archivo índice (
2849 Ya determinada la posición física del registro dentro del archivo de datos
2854 ), nos posicionamos en la misma, y leemos el header del registro (
2863 Contando así con el tamaño del registro, procedemos a leer el mismo (los
2864 datos), dando por finalizada la lectura.
2869 emufs_tipo2_leer_registro()
2875 En el proceso de alta de registros entrarán en juego dos archivos descriptos
2878 sección de archivos auxiliares
2880 , siendo estos el archivo índice (
2884 ), y el archivo de gaps / espacios libres (
2891 Así pues, a la hora de realizar una inserción de un registro en el archivo
2892 de datos, el procedimiento será el siguiente:
2895 Calculamos el espacio que necesitaremos para el registro: sizeof(
2903 ) + sizeof(registro).
2906 Determinamos donde debemos insertar el registro, ya sea un gap donde entre,
2907 o bien al final del archivo.
2910 Insertamos el registro e información de control (
2918 ), en la posición indicada en el paso 2.
2921 En caso de haber utilizado un GAP, actualizamos el espacio libre restante
2922 en el mismo y en caso de que se haya utilizado al totalidad del GAP, se
2923 lo elimina del archivo (
2930 Actualizamos la entrada correspondiente al registro ingresado (determinada
2931 por su RegID), en el archivo índice (
2935 ), indicando su offset donde podrá ser accedido luego.
2940 emufs_tipo2_agregar_registro()
2946 En el proceso de baja de registros entrarán en juego los tres archivos descripto
2949 sección de archivos auxiliares
2951 , siendo estos el archivo índice (
2955 ), el archivo de gaps / espacios libres (
2959 ) y el archivo de ID's liberados (
2966 Dado que en la implementación de este tipo de organización física contamos
2967 con los gaps o espacios libres entre registros, no se eliminará físicamente
2968 el registro del archivo de datos (
2972 ), pues entonces carecería de sentido el archivo anteriormente mencionado
2978 En cambio, se agrega el gap dejado por la eliminación a dicho archivo,
2979 y se marca físicamente en el archivo de datos la eliminación mediante un
2980 fill de los bytes correspondientes con un caracter nulo.
2981 (hexa 00 y con el propósito de probar fehacientemente que el sistema funciona).
2984 El proceso de baja o eliminación de un registro constará luego de los siguientes
2988 Se obtiene el offset o posición relativa en donde se encuentra grabado el
2989 registro dentro del archivo de datos.
2992 Se obtiene el tamaño del registro y se realiza un dummyfill del sector del
2993 archivo correspondiente al registro que se está dando de baja.
2994 (Se rellena la zona correspondiente a su header+data).
2997 Se agrega el GAP generado al archivo de gaps o espacios libres, y en caso
2998 de haberse generado un GAP lindante con otro GAP, se realizará un merge
2999 de los mismos y se los registrará bajo una única entrada en el archivo
3000 de espacios libres (.fsc).
3003 Se agrega el ID que fue liberado, al archivo de ID's liberados (
3007 ), al final del mismo (
3014 Se marca en el archivo índice (
3018 ) la eliminación, mediante el valor ¨-1¨ en el registro correspondiente
3019 al registro recién eliminado (se le cambia el valor al n-esimo registro,
3020 donde N = IDReg del reg eliminado).
3025 emufs_tipo2_borrar_registro()
3028 Modificación de registros
3031 Dada la naturaleza del archivo de ID's liberados, y el manejo de espacio
3032 libre del que consta esta organización de archivo, el proceso de modificación
3033 de un registro se limita a los siguientes pasos:
3036 Se realiza la lectura del registro, mediante el respectivo procedimiento
3037 ya desarrollado anteriormente.
3040 Una vez que se cuenta con los nuevos datos modificados, se procede a dar
3041 de baja el registro que ha sido modificado, e inmediatamente después se
3042 realiza una inserción con los nuevos datos.
3051 Como fue indicado, dada la naturaleza de PILA del subsistema de administración
3052 de ID liberados, es asegurado que la nueva inserción del registro modificado
3053 se realizará con el mismo RegID.
3058 emufs_tipo2_modificar_registro()
3061 Obtención de estadísticas
3064 Se puede tener acceso a las estadísticas generales del archivo, por ejemplo,
3065 cantidad de bloques, cantidad de registros, espacio libre total, espacio
3066 libre promedio, espacio libre máximo y mínimo, etc.
3069 Esta información es el resultado de ciertos cálculos realizados tanto en
3070 el archivo de datos como en los archivos índice.
3073 Completa una estructura del tipo EMUFS_Estadisticas con las estadísticas
3074 del archivo de datos, espacio libre total, cantidad de registros, cantidad
3075 de bloques, tamaño del archivo en bytes, relaciones entre tamaños y espacios
3081 emufs_tipo2_leer_estadisticas()
3084 Compactación del archivo de datos
3087 Así como los otros dos tipos de datos, el que nos compete también cuenta
3088 con la posibilidad de realizar la compactación de datos cuando el usuario
3089 lo desee, justificando todos los registros a izquierda, eliminando así
3090 los gaps existentes y decrementando el tamaño del archivo en disco (truncándolo
3094 Para poder comprender como hemos implementado el proceso de re-compactación
3095 en nuestro tipo de archivo 2, nos ayudaremos de esquemas a través de los
3096 cuales iremos describiendo el proceso.
3097 Notemos antes, que el proceso de compactación esta directamente ligado
3098 con el archivo de gaps o espacios libres (
3105 Comencemos con el siguiente cuadro situacional:
3106 \begin_inset Float figure
3113 Archivo con gaps entre registros previo a compactación
3117 \begin_inset Graphics
3118 filename graphics/Compact1.png
3130 Partiendo de esta base, el algoritmo de compactación tomará en su inicio
3131 al primer gap existente dentro del archivo de datos, en este caso llamado
3137 Luego, establecerá que el
3141 a partir de donde se quieren mover datos, sera:
3144 StartGap0 + SizeGap0 = EndGap0 = Source
3147 Lo cual no es nada más y nada menos que lo obvio, la fuente a partir de
3148 donde se mueven los datos, sera el fin del primer gap, donde comienzan
3154 ) del movimiento, se establece inicialmente, el inicio del gap, o sea
3156 StartGap0 = Destination
3161 Luego, el algoritmo entrara en un bucle while (mientras haya bucles por
3162 levantar), el cual trabajara hasta el final de la compactación de la siguiente
3173 Se levanta el próximo gap al levantado en una instancia previa.
3174 En este ejemplo, durante el primer loop del while, se levantará
3179 Luego, se calcula cuantos bytes hay que mover hacia el Destination de la
3203 Lo cual nuevamente es lógico pues querremos mover lo que se encuentra entre
3204 el final del primer gap levantado y el inicio del siguiente).
3207 Se realiza el movimiento de los datos, utilizando las direcciones
3215 , así como la variable
3219 que nos indica cuantos bytes transferir.
3225 La transferencia se hace de a chunks de 25 bytes + un resto segun el valor
3229 Se establece como gap de referencia, al ultimo gap leído (En este caso se
3242 ) y termina el código de repetición del bucle, dando lugar a la carga del
3243 siguiente gap en el inicio del mismo.
3251 Luego del primer bucle, el archivo se vera de la siguiente forma:
3252 \begin_inset Float figure
3259 Archivo con gaps en disco luego del primer bucle de compactación
3263 \begin_inset Graphics
3264 filename graphics/Compact2.png
3275 Notemos que al final de la porción de datos de los bytes movidos (donde
3280 ), hay basura que será pisada por el próximo movimiento.
3283 En el próximo loop, el bucle levantará un nuevo gap, y utilizando el gap
3284 anterior (En esta caso el Gap anterior será
3288 ) como referencia, realizará los mismos cálculos, desde donde transferir
3289 y cuantos bytes mover.
3290 (El destino es solo establecido inicialmente por código, y para el resto
3291 del algoritmo es el lugar donde quedo el puntero destination luego de la
3295 Una vez que se salga del bucle while, se realizará un último movimiento
3296 preprogramado, donde la fuente (
3300 ) será el final del ultimo gap, y la cantidad de bytes a mover será lo que
3301 se encuentre luego del mismo hasta el fin de archivo.
3304 Source = StartLastGap + SizeLastGap = EndLastGap
3307 Mustmove_bytes = Datsize - Source
3310 Damos por terminada así, la explicación del algoritmo de compresión el cual
3311 para el caso del tipo 2, es realmente bastante sencillo.
3316 emufs_tipo2_compactar()
3319 Consideraciones y Políticas de Diseño
3322 Se han tomado ciertas consideraciones para algunos casos particulares que
3323 se pueden presentar durante el uso/ejecución de la aplicación, así como
3324 también políticas respecto del diseño e implementación del sistema:
3327 En la organización física tipo 2 para los registros que se graban en disco
3328 hemos decidido utilizar como encabezado de cada uno de ellos, los datos
3329 [ID_REG][REG_SIZE], los cuales fueron detallados previamente.
3330 Si bien se podría haber descartado el grabado del ID del registro en el
3331 archivo de datos y puede parecer redundante, dado que poseemos el archivo
3332 índice con el offset directo, el mismo se lo graba por distintos motivos:
3336 A) En caso de la corrupción del archivo índice (.idx), podremos gracias a
3337 que poseemos en el archivo de datos, el ID de cada registro, recrear dicho
3338 índice, ayudándonos del archivo de espacios libres (
3342 ), para poder saltear los espacios libres y e ir recorriendo secuencialmente
3343 los registros, reconstruyendo así el índice en cuestión.
3344 (esta función de reconstrucción no pudo ser implementada para esta entrega,
3345 pero es una posibilidad real).
3349 B) Luego de un proceso de re-compactación, los espacios libres que pudieron
3350 haber existido en el archivo de datos (
3354 ), son eliminados y los registros han cambiado de posición.
3355 Por ello, recorriendo secuencialmente por única vez el archivo de datos,
3356 se procede a la actualización / reconstrucción del índice de direcciones
3364 Si se desea insertar un registro y no se puede hallar un gap o espacio libre
3365 donde quepa, se los inserta al final del archivo.
3368 Ante una operación de baja de un registro, el mismo no es físicamente borrado
3369 del archivo de datos (
3373 ), simplemente los bytes que ocupa son llenados con hexa (00).
3374 Paralelamente, se procede a actualiza el archivo índice, insertando como
3375 valor de OFFSET para el registro eliminado, el valor ¨-1¨, indicando así
3376 la inexistencia del registro para el futuro, y por otro lado se genera
3377 la entrada de espacio libre en el archivo de gaps (
3384 La reutilización de ID's liberados por previas operaciones de baja de registros,
3385 se ve implementada por el archivo de ID liberados (.did), y su comportamiento
3386 es el de una pila por lo que el último ID liberado, sera el próximo a ser
3390 Como fue explicado en la implementación del archivo índice, existe una correspon
3391 dencia 1 a 1 entre los registros allí presentes (en el .idx) y los ID's de
3392 los registros, por lo cual el registro N-ésimo del archivo índice, será
3393 el correspondiente al registro de datos cuyo ID es igual a N.
3396 El proceso de compactación de archivos, realiza los movimientos de información
3397 requeridos para dicho propósito de a chunks de 25 bytes por vez.
3398 Este valor es fijo, pero se lo podría hacer parametrizable mediante la
3399 GUI en próximas entregas.
3403 \begin_inset LatexCommand \label{cha:tipo3}
3407 Archivo con bloques parametrizados y registros de longitud constante
3410 Las distintas organizaciones de archivos buscan aprovechar al máximo el
3411 espacio del archivo.
3414 En este caso veremos que sucede luego de agregar y borrar una gran cantidad
3415 de registros del archivo, lo que provoca como consecuencia directa la fragmenta
3416 ción del archivo, es decir, quedan huecos entre un registro y otro, lo que
3417 produce un desperdicio de espacio.
3420 La implementación de este tipo de archivo puede ser encontrada en
3424 mientras que su interfaz pública está disponible en
3434 Esta organización guarda los registros pertenecientes al archivo en bloques
3435 de tamaño parametrizado, de modo que intentará guardar la mayor cantidad
3436 de registros que quepan en un bloque.
3440 Así como los graba, también tendrá la posibilidad de leer registros y borrarlos
3444 El archivo estará compuesto por una cabecera que da información sobre el
3445 tipo (2, o el valor T3 del tipo
3449 en este caso) de organización, el tamaño de los bloques y el tamaño de
3456 +-----------+-----------+-----------+------------------------//-+
3459 | tipo | tam_bloque| tam_reg | Cero o más bloques ...
3467 +-----------+-----------+-----------+------------------------//-+
3470 /- 4 bytes -/- 4 bytes -/- 4 bytes -/
3473 Organización Física de un Bloque
3476 Cada bloque será capaz de contener la cantidad de registros enteros que
3478 De esta manera un registro que no entre completamente en el bloque deberá
3479 almacenarse en un bloque diferente.
3482 Los bloques no contienen ninguna información adicional, solo se conoce su
3483 tamaño y se usa para delimitar
3484 \begin_inset Quotes eld
3488 \begin_inset Quotes erd
3491 zonas en el archivo y obtener de esta manera acceso semi-aleatorio a los
3495 bloque N-1 | bloque N | bloque N+1
3498 /----------+------------+------------+---------------+-----------/
3503 | registro 1 | registro 2 | espacio libre |
3508 /----------+------------+------------+---------------+-----------/
3511 /------------- tamaño del bloque ---------/
3514 Organización Física de Registros
3517 Cada registro se almacena en un bloque, y contiene una cabecera que indica
3522 por este motivo al realizar la búsqueda de espacio en un bloque se lo hará
3523 preguntando por el tamaño del registro más
3525 sizeof(EMUFS_REG_ID).
3531 +-----------+-------------------+
3538 +-----------+-------------------+
3541 /- 4 bytes -/- [tam_reg] bytes -/
3544 Organización Física de Registros
3549 Al ser los registros de longitud constante, se ha adoptado que un registro
3554 nunca podrá estar almacenado en algún lugar que no sea el comienzo de un
3556 De esta manera se puede calcular cuantos bloques ocupará un registro y
3557 se podrá solicitar lugar para almacenarlo con la ayuda de la función
3559 emufs_fsc_buscar_n_lugares(),
3561 que es muy importante para evitar el solapamiento de registros.
3562 Esta consideración acarrea como consecuencia directa un alto costo en términos
3563 del espacio desperdiciado.
3566 A continuación se presenta un ejemplo gráfico de un registro multibloque
3567 de 26 bytes (de contenido
3568 \begin_inset Quotes eld
3571 12345678901234567890123456
3572 \begin_inset Quotes erd
3575 ) almacenado en un archivo con bloques de bytes 14 bytes (10 para datos)
3576 y registros de 38 bytes:
3579 | bloque 0 | bloque 1 | bloque 2
3582 +-------------------+-------------------+-------------------+-//-+
3585 | registro 0 - 1/3 | registro 0 - 2/3 | registro 0 - 3/3..|
3592 |+----+------------+|+----+------------+|+----+--------+....| // |
3595 || id | datos ||| id | datos ||| id | datos |....|
3602 ||----+------------+||----+------------+||----+--------+....| // |
3605 || 0 | 1234567890 ||| 0 | 1234567890 ||| 0 | 123456 |....|
3612 |+----+------------+|+----+------------+|+----+--------+....| // |
3615 +-------------------+-------------------+-------------------+-
3625 4 bytes libres (e inutilizables) al final del bloque 2
3628 Funciones Principales
3639 se encuentran las cabeceras y la implementación de las funciones principales
3640 respectivamente, las cuales dan funcionalidad a esta organización.
3643 A continuación se comentará la descripción de algunas acciones importantes.
3646 Lectura de registros
3649 La lectura de un registro se realiza con la ayuda del archivo .
3653 el cual contiene la información de la posición del registro dentro del
3655 Una vez leída esta información, se recupera el bloque (en su totalidad)
3656 del archivo y se busca secuencialmente el registro con el
3665 emufs_tipo3_leer_registro()
3671 Graba un registro en un bloque donde haya espacio suficiente, y si no crea
3672 un nuevo bloque y lo agrega al final del archivo.
3675 Luego de grabar un registro, actualiza los archivos de índice .idx y .fsc
3676 para mantener la coherencia.
3679 Cuando nos encontramos con registros multibloque, se calcula cuantos bloques
3680 ocupará el registro de la siguiente manera:
3682 Cantidad de Bloques = 1 + Tamaño del Registro/(Tamaño del Bloque-Sizeof(EMUFS_RE
3686 Esta ecuación solo falla en el caso que el tamaño del registro y el tamaño
3687 del bloque sean iguales, en tal caso, se coloca el valor 1 en
3694 Y con esta información se realiza un ciclo
3698 que grabará tantas veces como sea necesario levantando y grabando los bloques
3704 emufs_tipo3_grabar_registro()
3710 Borra un registro del archivo de datos, para esto levanta el bloque al que
3711 pertenece el archivo y ajusta los demás registros justificándolos hacia
3715 Cabe destacar que para dar de baja un registro no hace falta borrarlo del
3716 archivo de datos, solo es necesario borrar las entradas en los archivos
3717 de índice, pero cuando se realiza el ajuste el algoritmo toma porciones
3718 del bloque del tamaño de un registro mas su encabezado - comenzando desde
3719 el siguiente al que fue borrado - y copia (sobreescribe) sobre el anterior.
3720 De esta manera, la información correspondiente al registro borrado no estará
3721 presente en el archivo de datos.
3722 Esto es una consecuencia del ajuste al borrar un registro, pudiendo no
3723 ser así, si no se realizara el mismo.
3726 En el caso de los registros multibloque, se eliminará la porción del registro
3727 contenida en el primer bloque y se actualizarán de manera conveniente los
3728 archivos índice, para restaurarlos a un valor verdadero.
3733 emufs_tipo3_borrar_registro()
3736 Obtención de estadísticas
3739 Se puede tener acceso a las estadísticas generales del archivo, por ejemplo,
3740 cantidad de bloques, cantidad de registros, espacio libre total, espacio
3741 libre promedio, espacio libre máximo y mínimo, etc.
3744 Esta información es el resultado de ciertos cálculos realizados tanto en
3745 el archivo de datos como en los archivos índice.
3748 Completa una estructura del tipo EMUFS_Estadisticas con las estadísticas
3749 del archivo de datos, espacio libre total, cantidad de registros, cantidad
3750 de bloques, tamaño del archivo en bytes, relaciones entre tamaños y espacios
3756 emufs_tipo3_leer_estadisticas()
3759 Compactación del archivo de datos
3762 Esta función intenta reorganizar el archivo de manera que el espacio libre
3763 sea lo menor posible, recordando siempre que un registro no puede ser almacenad
3764 o en mas de un bloque excepto que el tamaño del registro sea mayor que el
3768 Para realizar esto, se aprovecha la funcionalidad de
3770 emufs_tipo3_grabar_registro()
3772 ya que esta tiene la capacidad de determinar una posición mas eficiente
3773 en el archivo para un registro.
3774 Por esto lo que se hace es levantar uno por uno los registros y volverlos
3775 a grabar, de ese modo todos los
3779 que pudieron haberse formado por la eliminación de registros serán cubiertos
3783 Al estar utilizando recuperación de
3787 borrados, esto me asegura que el registro borrado-guardado conservará el
3791 Al finalizar este proceso se verifica si existen bloques vacíos para truncar
3793 Lo mismo se debe hacer con el archivo de espacios libres .
3797 el cual disminuye su tamaño también.
3802 void emufs_tipo3_compactar()
3805 Consideraciones y Políticas de Diseño
3808 Se han tomado ciertas consideraciones para algunos casos particulares que
3809 se pueden presentar durante el uso/ejecución de la aplicación.
3812 Cada registro tiene un encabezado que indica el
3819 Si el tamaño del registro es mayor que el tamaño del bloque el registro
3820 se particionará en la cantidad de bloques que sea necesario, pero siempre
3821 se guardará desde el comienzo de un bloque, esto quiere decir que nunca
3822 se podrá encontrar un comienzo de registro en algún lugar de un bloque
3823 que no sea el comienzo del mismo.
3826 Si el registro se divide en mas de un bloque, se le coloca el id como encabezado
3827 igualmente, pero en el archivo .
3831 solo se guarda el primer bloque.
3836 se actualizan todos los bloques con el espacio libre que realmente tienen.
3839 EMUFS View (interfaz gráfica)
3845 La interfaz de visualización de EMUFS permite interactuar con los distintos
3846 tipos de archivos para cada conjunto de datos almacenado (ya sean facturas,
3847 articulos, o notas de facturas).
3853 Para poder correr la interfaz gráfica necesitará previamente compilarla
3854 (así como compilar los programas auxiliares), para ello necesitará cumplir
3855 con los siguiente requisitos:
3858 Compilador gcc versión 3.3.x preferentemente.
3859 No podemos garantizar la compatibilidad con otras versiones debido a cambios
3860 drásticos que sufrieron las versiones anteriores.
3863 Parser XML libxml2 versión 2.6.x .
3864 Versiones 2.5 y anteriores son incompatibles en la API y no funcionarán.
3867 libncurses version 5 o superior (probado con 5.4).
3876 Para compilar la GUI solo debe ejecutar el comando make dentro del directorio
3878 Esto compilará primero una biblioteca estática con los manejadores de los
3879 3 tipos de archivo y luego compilará la GUI.
3885 Preparar el banco de pruebas
3888 Antes de comenzar a utilizar la GUI deberá generar los archivo XML desde
3889 donde serán leídos los datos para generar los archivos que luego se utilizará.
3890 Para ello el proceso de compilación creará 2 ejecutable : generar_fact
3891 y generar_art, que se ubicarán en la carpeta generar dentro de emufs_gui.
3894 Estos programas generan facturas y artículos respectivamente en forma aleatorio,
3895 utilizando diccionarios de datos para llenar los campos.
3896 Primero deberá ejecutar generar_art, ya que éste último crea un diccionario
3897 de artículos que luego utilizará generar_fact para los items de las facturas.
3900 Ambos programas reciben 2 parámetros : el nombre de archivo de salida y
3901 la cantidad de entradas a generar.
3904 El generador de facturas fue diseñado para cumplir con los porcentajes pedidos
3905 por el enunciado en algunos aspectos.
3906 La cantidad de facturas por dia del mes es aleatoria.
3912 El programa acepta varios parámetros, algunos de ellos opcionales, otros
3913 obligatorios dependiendo de las elecciones realizadas.
3916 Para obtener una completa descripción de los parámetros el programa acepta
3918 \begin_inset Quotes eld
3922 \begin_inset Quotes erd
3926 \begin_inset Quotes eld
3930 \begin_inset Quotes erd
3933 para mostrar una ayuda en línea.
3936 Si el programa es ejecutado sin parámetros tratará de recuperar los artículos
3937 y las facturas desde archivo previamente creados.
3940 Para crear un archivo de artículos a partir de un archivo XML bien formado,
3941 se debe ejecutar el programa con la opción
3942 \begin_inset Quotes eld
3946 \begin_inset Quotes erd
3950 Dicha opción espera que el siguiente parámetro sea el nombre del archivo
3951 a leer, y que éste útimo tenga extensión xml (notar que es solo minúsculas).
3952 A continuación espera encontrar el tipo de archivo que se quiere crear,
3953 pudiendo ser éste último 1, 2 ó 3.
3954 De ser el tipo de archivo con bloques, se le exigirá que ingrese como último
3955 parámetro el tamaño del mismo.
3958 Para crear el archivo de facturas es el mismo procedimiento, solo que utilizando
3960 \begin_inset Quotes eld
3964 \begin_inset Quotes erd
3968 Luego de los parámetros de tipo y tamaño de bloque debe especificarse el
3969 tipo y tamaño de bloque para el archivo de notas.
3973 Debe saber que estos parámetros no son mutuamente excluyentes, por lo que
3974 podrá utilizarlos al mismo tiempo.
3980 A continuación se da una lista detallada de las operaciones que son posibles
3981 hacerse desde esta interfaz :
3984 Alta, baja y modificación de Artículos.
3985 Para ello se abrirá una ventana donde se podrá editar comodamente los datos.
3988 Alta, baja y modificación
3994 En la modificación de una factura no se podrán cambiar ni la cantidad de
3995 items y los datos de los mismo!.
3996 La nota si podrá ser modificada.
4003 Ver fisicamente los registros de cualquiera de los archivos sin importar
4004 el tipo al que pertenezcan.
4005 Desde aquí podrá tambien eliminar, agregar o modificar el registro actual.
4009 Para aquellos archivos que hallan sido creados con un tipo con bloques,
4010 podrá verlos fisicamente, viendo el bloque actual y los anteriores/posteriores.
4013 Ver las estadísticas de cada archivo según su tipo, para realizar comparativas
4016 Cambiar el formato de cualquier tipo o parametros de archivo.
4019 Compactar los archivos.
4022 Decisiones de Diseño
4025 Durante el desarrollo se han tomado ciertas decisiones en el diseño o restriccio
4027 En este punto nos centraremos en las especificas tomadas por la interfaz
4028 de visualización, y no tomaremos en cuenta las que ponen los tipos de archivo
4032 La cantidad de items por factura es igual a 10 para archivos de registro
4033 de longitud fija y bloque parametrizado (TIPO 3).
4034 Esta decición fue tomada por poner un valor típico de items que puede haber
4035 en una factura, evaluando un caso de un comercio chico.
4036 Como el tipo de archivo permite cortar un registro y guardarlo en varios
4037 bloques consecutivos, la restricción de cantidad solo es un hecho de elección,
4038 y así pusieramos 100, 1000, 10000 no habría diferencia, ya que el tipo
4039 de archivo lo guardaría sin problemas.
4042 Si el archivo es de TIPO 3 y se agregan más de 10 items estos son truncados
4043 y descartados sin aviso al usuario.
4044 Esta fue una desición basada en el tiempo del proyecto.
4045 De tener que validar y consultar al usuario se hubiera perdido tiempo de
4046 mucho valor para completar objetivos más importantes del TP.
4049 Los campos son delimitados por el caracter nulo (en caso de los strings)
4050 y por la longitud del tipo de dato en caso de los campos numéricos.
4051 De esta forma se aprovechan las características de manejo de string en
4058 Un ejemplo de vista de registros es la que se observa a continuación :
4062 \begin_inset Graphics
4063 filename gui_ver_registros.eps
4072 Como puede verse el registro actual se ve resaltado respecto de los demás.
4073 También se puede observar que en este caso (el bloque es de 2000 bytes)
4074 no entra toda la información en pantalla, pero es posible desplazar utilizando
4078 Los datos binarios son convertidos a texto para ser mostrados, siendo la
4079 representación elegida :
4082 (XXX) : Representa un ID.
4083 En el caso de las facturas también aparece en los datos el número de índice
4084 de la nota asociada con esta representación.
4087 {XXX} : Representa el tamaño de los datos.
4088 Esto siempre y cuando el registro sea de longitud variable (TIPO1 y TIPO2).
4091 También es posible ejecutar acciones de edición sobre el registro seleccioado,
4092 así como buscar por ID de registro.
4095 Cuando se procesa la información en crudo (es decir, el area de datos) algunos
4096 bytes son modificados para evitar errores visuales.
4097 Un caso es cuando el bytes es compuesto por 8 bits de valor 0 (caracter
4101 Lo que se hace es cambiarlo por un caracter que tenga representacion visual
4102 (en este caso un *).
4103 Lo mismo suscede para los caracteres de control (
4109 r por ejemplo) y los espacion.
4110 Esta política fue tomada ya que estos caracteres modifican la salida en
4111 pantalla, y de no evitar su envío a la pantalla, producirían resultados
4112 inesperados en la visualización.
4118 A continuación se enumera los errores que sabemos que existen, que no hemos
4119 tenido tiempo de corregir, pero que no hacen al TP en sí :
4122 Si la consola o terminal cambia de tamaño la GUI no sigue el nuevo tamaño,
4123 pudiendose producir defectos visuales.
4124 Esto es debido a que se debe capturar una señal que envia el SO, pero no
4125 pudimos hacer que funciones con todas las terminales bajo X, por lo que
4126 se decidio dejarlo para cuando tengamos tiempo.
4129 Si la GUI fue compilada con -DDEBUG y no se utiliza un PIPE para redirigir
4130 la salida de error estandar, es posible que algun componente del programa
4131 emita un mensaje de debug o warning y esta cause defectos de visualización
4132 o el programa deje directamente de funcionar.
4133 Esto es un defecto de la biblioteca NCurses.
4136 Cuando se cargan datos desde el XML y este contiene caracteres extendidos,
4137 estos son mostrados en UTF8 en la pantalla.
4138 Si no posee una consola configurada en UTF8 verá los caracteres extendidos
4139 en su representación ASCII (2 caracteres por cada caracter extendido).
4140 Esto se da a causa de que la LibXml maneja de forma interna todo en UTF8
4141 sin importar el encoding declarado en el XML.
4142 El encoding solo lo tienen en cuenta para guado se guarde.
4143 No nos hemos tomado el trabajo de hacer la conversión solo por cuestiones
4147 Comparación de tipos de archivo (conclusiones)
4150 Método utilizado para la comparación
4153 Para realizar la comparación entre los distintos tipos de archivo, se generaron
4154 un XML de artículos con 200 entradas y uno de facturas de 1750 entradas.
4155 Los valores fueron arbitrarios y un poco más elevados que los requeridos
4156 en el enunciado para poner a prueba el sistema.
4159 En la tabla que se dará más adelante, se pueden apreciar los datos característic
4160 os de cada tipo de archivo.
4161 El método de prueba fue el siguiente :
4164 Para cada tipo de archivo se cargaron los archivos XML de prueba.
4167 Se anotaron las estadísticas que entrega la GUI.
4170 Se eliminaron alrededor de 50 artículos y 200 facturas.
4171 El valor no es exacto, puesto que al ser pseudo-aleatoria la cantidad borrada
4172 puede no ser 50 o 200.
4175 Se anotaron las estadísticas nuevamente.
4178 Ahora, los tamaños de bloque para los archivos con bloques fueron tomados
4179 de 512 bytes, por ser una unidad típica de dispositivos de almacenamiento,
4180 y nos pareció lógico dada la similitud utilizar esta unidad.
4187 \begin_inset Float table
4194 Artículos con archivos con tamaño de bloque 512 (cuando aplica)
4200 \begin_inset Tabular
4201 <lyxtabular version="3" rows="8" columns="7">
4202 <features islongtable="true">
4203 <column alignment="left" valignment="top" leftline="true" width="0">
4204 <column alignment="center" valignment="top" leftline="true" width="0">
4205 <column alignment="center" valignment="top" leftline="true" width="0">
4206 <column alignment="center" valignment="top" leftline="true" width="0">
4207 <column alignment="center" valignment="top" leftline="true" width="0">
4208 <column alignment="center" valignment="top" leftline="true" width="0">
4209 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
4210 <row topline="true" bottomline="true">
4211 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4221 <cell multicolumn="1" alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
4231 <cell multicolumn="1" alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
4241 <cell multicolumn="1" alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
4251 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4261 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4271 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4282 <row topline="true" bottomline="true">
4283 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4290 Tamaño de bloque: 512
4293 <cell multicolumn="1" alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
4303 <cell multicolumn="2" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
4310 <cell multicolumn="2" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
4317 <cell multicolumn="1" alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
4327 <cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4334 <cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4342 <row topline="true">
4343 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4353 <cell multicolumn="1" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4363 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4373 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4383 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4393 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4403 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4414 <row topline="true">
4415 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4422 Tamaño Datos de Control
4425 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4435 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4445 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4455 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4465 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4475 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4486 <row topline="true">
4487 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4497 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4507 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4517 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4527 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4537 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4547 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4558 <row topline="true">
4559 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4566 Media de Espacio Libre
4569 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4579 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4589 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4599 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4609 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4619 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4630 <row topline="true">
4631 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4638 Máximo de Espacio Libre
4641 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4651 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4661 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4671 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4681 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4691 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4702 <row topline="true" bottomline="true">
4703 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4710 Mínimo de Espacio Libre
4713 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4723 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4733 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4743 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4753 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4763 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4782 \begin_inset Float table
4789 Artículos con archivos con tamaño de bloque 1024 (cuando aplica)
4795 \begin_inset Tabular
4796 <lyxtabular version="3" rows="8" columns="7">
4797 <features islongtable="true">
4798 <column alignment="left" valignment="top" leftline="true" width="0">
4799 <column alignment="center" valignment="top" leftline="true" width="0">
4800 <column alignment="center" valignment="top" leftline="true" width="0">
4801 <column alignment="center" valignment="top" leftline="true" width="0">
4802 <column alignment="center" valignment="top" leftline="true" width="0">
4803 <column alignment="center" valignment="top" leftline="true" width="0">
4804 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
4805 <row topline="true" bottomline="true">
4806 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4816 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
4824 <cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
4832 <cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
4840 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
4848 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4856 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4865 <row topline="true" bottomline="true">
4866 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4873 Tamaño de bloque: 1024
4876 <cell multicolumn="1" alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
4886 <cell multicolumn="2" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
4893 <cell multicolumn="2" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
4900 <cell multicolumn="1" alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
4910 <cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4917 <cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4925 <row topline="true">
4926 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4936 <cell multicolumn="1" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4946 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4956 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4966 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4976 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4986 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4997 <row topline="true">
4998 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5005 Tamaño Datos de Control
5008 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5018 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5028 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5038 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5048 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5058 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
5069 <row topline="true">
5070 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5080 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5090 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5100 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5110 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5120 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5130 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
5141 <row topline="true">
5142 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5149 Media de Espacio Libre
5152 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5162 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5172 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5182 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5192 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5202 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
5213 <row topline="true">
5214 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5221 Máximo de Espacio Libre
5224 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5234 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5244 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5254 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5264 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5274 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
5285 <row topline="true" bottomline="true">
5286 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5293 Mínimo de Espacio Libre
5296 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5306 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5316 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5326 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5336 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5346 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
5367 Evidentemente para el caso de artículos, una muy mala elección sería utilizar
5368 el archivo de tipo3, puesto que al usar registros constantes es posible
5369 que se desperdicie mucho espacio si ocurren muchas eliminaciones (como
5370 se observa en la tabla).
5371 Entre los tipos 1 y 2 no existe mucha diferencia en los números, por lo
5372 que la decisión podría ser tomada en base a los tiempos de acceso.
5373 Tomando este criterio el T2 sería la mejor forma de almacenar los datos
5374 si lo más frecuente son lecturas, ya que al leer se puede obtener el offset
5375 desde el principio del registro, mientras que en el tipo1 se debe hacer
5376 una búsqueda secuencial sobre el bloque, y de ser éste último muy grande
5377 el tiempo de acceso puede ser elevado.
5380 Para operaciones que requiera muchas bajas de elementos el tipo 2 no sería
5381 la mejor opción, puesto que la liberación es compleja, ya que cuando se
5382 da de baja un registro se debe verificar si dicho espacio se solapa con
5383 algún espacio libre actual, de manera de mantener espacios libres como
5384 lo hacen los sistemas de archivo ext2, manteniendo la lista de los offsets
5385 y tamaño de espacios libres, a fin de buscar el que mejor ajuste en caso
5389 Para el caso de artículos, donde puede haber un continuo cambio en la oferta
5390 de nuestro negocio, nos inclinaremos por el tipo de archivo 1, con un tamaño
5392 Solo recordaremos compactar el archivo periódicamente a fin de minimizar
5393 el espacio desperdiciado.
5400 \begin_inset Float table
5407 Facturas con archivos con tamaño de bloque 512 (cuando aplica)
5413 \begin_inset Tabular
5414 <lyxtabular version="3" rows="8" columns="7">
5415 <features islongtable="true">
5416 <column alignment="left" valignment="top" leftline="true" width="0">
5417 <column alignment="center" valignment="top" leftline="true" width="0">
5418 <column alignment="center" valignment="top" leftline="true" width="0">
5419 <column alignment="center" valignment="top" leftline="true" width="0">
5420 <column alignment="center" valignment="top" leftline="true" width="0">
5421 <column alignment="center" valignment="top" leftline="true" width="0">
5422 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
5423 <row topline="true" bottomline="true">
5424 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5434 <cell multicolumn="1" alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
5444 <cell multicolumn="1" alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
5454 <cell multicolumn="1" alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
5464 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5474 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5484 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
5495 <row topline="true" bottomline="true">
5496 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5503 Tamaño de bloque = 512
5506 <cell multicolumn="1" alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
5516 <cell multicolumn="2" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
5523 <cell multicolumn="2" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
5530 <cell multicolumn="1" alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
5540 <cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5547 <cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
5555 <row topline="true">
5556 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5566 <cell multicolumn="1" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5576 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5586 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5596 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5606 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5616 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
5627 <row topline="true">
5628 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5635 Tamaño Datos de Control
5638 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5648 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5658 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5668 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5678 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5688 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
5699 <row topline="true">
5700 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5710 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5720 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5730 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5740 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5750 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5760 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
5771 <row topline="true">
5772 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5779 Media de Espacio Libre
5782 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5792 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5802 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5812 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5822 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5832 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
5843 <row topline="true">
5844 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5851 Máximo de Espacio Libre
5854 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5864 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5874 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5884 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5894 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5904 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
5915 <row topline="true" bottomline="true">
5916 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5923 Mínimo de Espacio Libre
5926 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5936 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5946 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5956 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5966 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
5976 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
5995 \begin_inset Float table
6002 Artículos con archivos con tamaño de bloque 1024 (cuando aplica)
6008 \begin_inset Tabular
6009 <lyxtabular version="3" rows="8" columns="7">
6010 <features islongtable="true">
6011 <column alignment="left" valignment="top" leftline="true" width="0">
6012 <column alignment="center" valignment="top" leftline="true" width="0">
6013 <column alignment="center" valignment="top" leftline="true" width="0">
6014 <column alignment="center" valignment="top" leftline="true" width="0">
6015 <column alignment="center" valignment="top" leftline="true" width="0">
6016 <column alignment="center" valignment="top" leftline="true" width="0">
6017 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
6018 <row topline="true" bottomline="true">
6019 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6027 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
6035 <cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
6043 <cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
6051 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
6059 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6067 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
6076 <row topline="true" bottomline="true">
6077 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6091 Tamaño de bloque: 1024
6094 <cell multicolumn="1" alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
6111 <cell multicolumn="2" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
6118 <cell multicolumn="2" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
6125 <cell multicolumn="1" alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
6142 <cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6149 <cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
6157 <row topline="true">
6158 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6168 <cell multicolumn="1" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6178 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6188 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6198 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6208 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6218 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
6229 <row topline="true">
6230 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6237 Tamaño Datos de Control
6240 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6250 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6260 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6270 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6280 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6290 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
6301 <row topline="true">
6302 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6312 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6322 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6332 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6342 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6352 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6362 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
6373 <row topline="true">
6374 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6381 Media de Espacio Libre
6384 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6394 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6404 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6414 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6424 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6434 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
6445 <row topline="true">
6446 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6453 Máximo de Espacio Libre
6456 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6466 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6476 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6486 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6496 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6506 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
6517 <row topline="true" bottomline="true">
6518 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6525 Mínimo de Espacio Libre
6528 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6538 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6548 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6558 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6568 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
6578 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
6599 Primero descartaremos al tipo 3 como un buen modo de almacenar las facturas,
6600 por el sólo hecho de que la cantidad de ítems que puede tener una factura
6601 está limitada al tamaño de registro utilizado.
6602 Esto sólo sería razonable en un contexto en donde la variabilidad del registro
6603 no sea drástica como es el caso de las facturas.
6604 De tomar valores grande de registros, se corre el riesgo de tener mucho
6605 espacio desperdiciado en los datos, y tomando valores pequeños de registro
6606 se limita el sistema en cuanto a cantidad de ítems a colocar en una factura
6608 Se puede notar una leve baja en el espacio libre, y aumentar el tamaño
6609 del bloque quizás más haga que este valor baje, pero se aumentaría el tiempo
6610 de acceso a los registros.
6613 Nuevamente tenemos una disputa entre el los tipo 1 y 2.
6616 Idealmente, si sólo tuviéramos altas el mejor tipo sería el 2 sin dudarlo,
6617 ya que aprovecha el máximo espacio al no tener pérdidas, debido a que los
6618 registros van uno a continuación del otro.
6619 También tenemos la ventaja de que el acceso es directo.
6620 Para un caso teórico donde las facturas no se dan de baja, esto sería ideal.
6621 Hasta aquí solo hemos visto comparaciones con la carga inicial.
6624 Analizaremos ahora que pasa luego de borrar varios registros en posiciones
6626 Primeramente se puede observar que el tamaño de datos de control es similar
6627 (recordar que se guarda el id del registro para poder realizar tareas de
6628 recuperación de datos en caso de que el índice se dañe).
6629 El máximo espacio libre no nos da mucha información, ya que en el caso
6630 del tipo 1 podríamos tener n bloques consecutivos libres y tener posiciones
6631 para almacenar registros grandes en ambos casos (recordar que tipo1 tiene
6632 recuperación de espacio libre para n bloques consecutivos, no siempre se
6634 De todos determinar un espacio libre para un archivo de tipo 2 es mucho
6635 más rápido que para tipo1 si el tamaño del registro es grande, ya que el
6636 archivo de tipo1 debe hacer una búsqueda sobre n bloques, mientras que
6637 el tipo 2 encuentra un gap de tamaño suficiente más rápido.
6640 Pero no todo es color de rosa en el mundo de archivos de tipo2.
6641 Como se dijo anteriormente las bajas de registros requieren de un proceso
6642 grande al actualizar el índice de espacio libre, para asegurarse de tomar
6643 espacios libres consecutivos como un solo espacio libre, y en el caso de
6644 que las bajas y las altas comunes, esto es una pérdida de performance del
6648 En este caso como se trata de facturas, y suponemos que como usuarios de
6649 sistema queremos cancelar pocas facturas (ya que cancelar una factura significa
6650 que se cayó una venta) optamos por que el mejor tipo de archivo para almacenar
6651 las facturas sera el tipo2.