Ficheros

=Tema 4= = = =3.1 ACCESO Y ORGANIZACIÓN DE FICHEROS=

Los sistemas de ficheros surgieron al tratar de informatizar el manejo de los archivadores manuales con objeto de proporcionar un acceso más eficiente a los datos.

En lugar de establecer un sistema centralizado en donde almacenar todos los datos de la organización o empresa, se escogió un modelo descentralizado en el que cada sección o departamento almacena y gestiona sus propios datos. Algo que siempre ocurre en los sistemas de ficheros es que hay una gran cantidad de datos repetidos. A raíz de esto, los sistemas de ficheros presentan una serie de inconvenientes:
 * Separación y aislamiento de los datos. Cuando los datos se separan en distintos ficheros, es más complicado acceder a ellos, ya que el programador de aplicaciones debe sincronizar el procesamiento de los distintos ficheros implicados para asegurar que se extraen los datos correctos.
 * Duplicación de datos. La redundancia de datos existente en los sistemas de ficheros hace que se desperdicie espacio de almacenamiento y lo que es más importante: puede llevar a que se pierda la consistencia de los datos. Se produce una inconsistencia cuando copias de los mismos datos no coinciden.
 * Dependencia de datos. Ya que la estructura física de los datos (la definición de los ficheros y de los registros) se encuentra codificada en los programas de aplicación, cualquier cambio en dicha estructura es difícil de realizar. El programador debe identificar todos los programas afectados por este cambio, modificarlos y volverlos a probar, lo que cuesta mucho tiempo y está sujeto a que se produzcan errores. A este problema, tan característico de los sistemas de ficheros, se le denomina también falta de independencia de datos lógica-física.
 * Formatos de ficheros incompatibles. Ya que la estructura de los ficheros se define en los programas de aplicación, es completamente dependiente del lenguaje de programación. La incompatibilidad entre ficheros generados por distintos lenguajes hace que los ficheros sean difíciles de procesar de modo conjunto.
 * Consultas fijas y proliferación de programas de aplicación. Desde el punto de vista de los usuarios finales, los sistemas de ficheros fueron un gran avance comparados a los sistemas manuales. A consecuencia de esto, creció la necesidad de realizar distintos tipos de consultas de datos. Sin embargo, los sistemas de ficheros son muy dependientes del programador de aplicaciones: cualquier consulta o informe que se quiera realizar debe ser programado por él. En algunas organizaciones se conformaron con fijar el tipo de consultas e informes, siendo imposible realizar otro tipo de consultas que no se hubieran tenido en cuenta a la hora de escribir los programas de aplicación.

En otras organizaciones hubo una proliferación de programas de aplicación para resolver todo tipo de consultas, hasta el punto de desbordar al departamento de proceso de datos, que no daba abasto para validar, mantener y documentar dichos programas. **__Métodos de acceso a ficheros:__** La forma mas común de estructura de archivo es el archivo secuencial. En este tipo de archivo, un formato fijo es usado para los registros. Todos los registros tienen el mismo tamaño, constan del mismo número de campos de tamaño fijo en un orden particular. Como se conocen la longitud y la posición de cada campo, solamente los valores de los campos se necesitan almacenarse; el nombre del campo y longitud de cada campo son atributos de la estructura de archivos. Un campo particular, generalmente el primero de cada registro se conoce como el campo clave. El campo clave identifica unívocamente al registro. Así, los valores de la clave para registros diferentes son siempre diferentes. Los archivos secuenciales son típicamente utilizados en aplicaciones de proceso de lotes Y son óptimos para dichas aplicaciones si se procesan todos los registros. La organización secuencias de archivos es la única que es fácil de usar tanto en disco como en cinta. Para las aplicaciones interactivas que incluyen peticione s o actualizaciones de registros individuales, los archivos secuenciales ofrecen un rendimiento pobre. Normalmente un archivo secuencial se almacena en bloques, en un orden secuencial simple de los registros. La organización física del archivo en una cinta o disco se corresponde exactamente con la ubicación lógica del archivo. En este caso, el procedimiento para ubicar los nuevos registros en un archivo de pila separado, llamado archivo de registro (log file) o archivo de transacciones. Periódicamente, se realiza una actualización por lotes que mezcla el archivo de registro con el archivo maestro para producir un nuevo archivo en secuencia correcta de claves.
 * **Archivos Secuenciales**

Un método popular para superar las desventajas de los archivos secuenciales es el del archivo secuencias indexado. El archivo secuencial indexado mantiene las características básicas de los archivos secuenciales: los registros están organizados en una secuencia basada en un campo. Dos características se añaden: un índice del archivo para soportar los accesos aleatorios y un archivo de desbordamiento (overflow). El índice provee una capacidad de búsqueda para llegar rápidamente a las proximidades de un registro deseado. El archivo de desbordamiento (overflow) es similar al archivo de registro usado en un archivo secuencial, pero esta integrado de forma que los registros del archivo de desbordamiento se ubican en la dirección de un puntero desde si registro precedente. En la estructura secuencial indexada más simple, se usa un solo nivel de indización. El índice, en este caso, es un archivo secuencial simple. Cada registro del archivo índice tiene dos campos: un campo clave, que es el mismo que el campo clave del archivo principal y un puntero al archivo principal. Para encontrar un campo específico se busca en el índice hasta encontrar el valor mayor de la clave que es igual o precede al valor deseado de la clave. La búsqueda continúa en el archivo principal a partir de la posición indicada por el puntero.
 * **Archivos Secuenciales indexados**

Los archivos secuenciales indexados retienen la limitación del archivo secuencial: la eficacia en el procesamiento se limita al basado en un único campo del archivo. Cuando es necesario buscar un registro basándose en algún otro atributo distinto del campo clave ambas formas de archivo secuencial no son adecuadas. En algunas aplicaciones esta flexibilidad es deseable. Para alcanzar esta flexibilidad, se necesita una estructura que utilice múltiples índices, uno para cada tipo de campo que pueda ser objeto de la búsqueda.
 * **Archivos Indexados**

Se suelen utilizar dos tipos de índices. Uno índice exhaustivo contiene una entrada par cada registro del archivo principal. Otro índice parcial contendrá entradas a los registros donde este el campo de interés. Con registros de longitud variable, algunos registros no contendrán todos los campos.

Los archivos indexados son muy utilizados en aplicaciones donde es critica la oportunidad de la información y donde los datos son rara vez procesados de forma exhaustiva. Los archivos directos explotan la capacidad de los discos para acceder directamente a cualquier bloque de dirección conocida. Como en los archivos secuenciales y secuenciales indexados, se requiere un campo clave en cada registro. Sin embargo, aquí no hay concepto de ordenamiento secuencial. = 3.2 Ficheros desordenados =
 * **Archivos Directos o de Dispersión**

En un fichero desordenado, también denominado fichero heap, los registros se colocan en el fichero en el orden en que se van insertando. Cuando llega un nuevo registro, se inserta en el último bloque del fichero; si el fichero está lleno, se le añade más espacio. Esta organización hace que la inserción sea muy eficiente. Sin embargo, cuando se trata de acceder a un registro del fichero, es necesario realizar una búsqueda lineal recorriendo todos los bloques del fichero uno tras otro, hasta encontrar el registro deseado. Esto hace que las búsquedas de registros en los ficheros desordenados sean muy lentas.

Si lo que se desea es obtener todos los registros del fichero presentándolos en un determinado orden (según el valor de alguno de sus campos), es necesario realizar una ordenación externa si el fichero completo no cabe en memoria principal: se van leyendo los registros, se escriben de forma ordenada en un fichero temporal en disco y, finalmente, se accede a este último fichero para leer los registros una vez ordenados.

Para eliminar un registro es necesario traer a memoria principal el bloque en el que se encuentra, después se marca el registro como borrado y, por último, se vuelve a escribir el bloque en el mismo lugar en que se encontraba. El espacio que ocupaba el registro borrado no se reutiliza, lo que hace que empeoren las prestaciones, por lo que, cada cierto tiempo, habrá que realizar una reorganización del fichero para recuperar este espacio.

Para modificar un registro también es necesario traerlo a memoria principal y actualizarlo. Si el registro modificado cabe en el bloque en el que se encontraba, se reescribe el bloque en su sitio. Si el registro modificado ha aumentado su tamaño de modo que no cabe en el bloque, hay que borrar el registro original y añadir el registro modificado al final del fichero.

Los ficheros desordenados son los más adecuados cuando se trata de cargar grandes cantidades de datos, ya que la inserción es muy eficiente al no tener que realizarse ningún cálculo para determinar la posición que debe ocupar el registro en el fichero.

= 3.3 Ficheros ordenados =

En los ficheros ordenados, los registros se encuentran ordenados físicamente según el valor de uno o varios campos. A este campo o campos se les denomina campos de ordenación.

Cuando se trata de buscar un registro en un fichero ordenado, se puede utilizar una búsqueda binaria sólo cuando se busca por el campo de ordenación. Si la búsqueda se realiza a través de cualquier otro campo, se debe hacer una búsqueda lineal. Si se quiere leer el fichero ordenadamente, la operación será muy eficiente si el orden escogido es el del campo de ordenación. Si el orden de lectura es sobre cualquier otro campo, es preciso realizar una ordenación externa.

Para insertar un registro hay que encontrar su posición en el fichero según el orden establecido, hacer hueco y escribir. Si hay espacio suficiente en el bloque correspondiente, se reordena el bloque y se escribe en el fichero. Si no hay espacio en el bloque, habrá que mover algún registro al siguiente bloque. Si este último bloque no tiene espacio suficiente para estos registros, habrá que mover algunos registros al bloque siguiente, y así sucesivamente. Esto hace que la inserción de un registro pueda ser muy costosa. Una solución consiste en tener un fichero desordenado de desborde, en donde se van realizando todas las inserciones. Cada cierto tiempo, el fichero de desborde se mezcla con el fichero ordenado, de modo que así las inserciones son muy eficientes. Esto perjudica a las búsquedas, ya que si el registro no se encuentra mediante búsqueda binaria en el fichero ordenado, hay que realizar una búsqueda lineal en el fichero de desborde.

Cuando se trata de eliminar un registro, hay que encontrarlo y marcarlo como borrado. Como en los ficheros desordenados, cada cierto tiempo se debe realizar una reorganización del fichero. Para modificar un registro hay que encontrarlo y actualizarlo en caso de que quepa en el bloque en el que se encontraba. Si el registro actualizado ya no cabe en su ubicación, hay que borrarlo, hacer hueco e insertarlo. Si en la actualización se modifica el campo de ordenación, entonces es muy probable que haya que cambiar el registro de lugar para mantener el orden: habrá que borrarlo, hacer hueco e insertarlo de nuevo.

Los ficheros ordenados no se suelen utilizar como ficheros de datos en los SGBD.

= 3.4 Ficheros dispersos =

En los ficheros dispersos, la dirección de cada registro se calcula aplicando cierta función sobre uno o varios de sus campos, denominados campos de dispersión. A la función se le denomina función de dispersión. Los registros de este tipo de ficheros parece que han sido distribuidos de forma aleatoria por el mismo, por lo que a estos ficheros también se les denomina ficheros aleatorios o ficheros directos. El acceso a los datos es muy rápido sólo si se busca con la condición de igualdad sobre el campo de dispersión.

La función de dispersión se debe escoger de modo que los registros queden distribuidos uniformemente en todo el fichero. La técnica más popular consiste en utilizar el resto de la división entera: se toma el valor de un campo, se divide entre un valor determinado y se utiliza el resto de la división entera para obtener la dirección en disco. Otra técnica es el plegado. Consiste en tomar distintas partes del campo de dispersión y aplicarles alguna función aritmética. Por ejemplo, si el campo de dispersión es el DNI, se pueden tomar sus dígitos por parejas y sumarlos. Si el campo tiene caracteres, se puede tomar su valor ASCII para aplicar la operación aritmética. En realidad, la función de dispersión produce un número de bloque relativo. En una tabla que se encuentra en la cabecera del fichero se convierte este número en la dirección del bloque en el disco.

El problema que presentan la mayoría de las funciones de dispersión es que no garantizan direcciones únicas, de modo que varios registros se asocian a una misma dirección de bloque. Si a un bloque se asocian más registros de los que realmente caben, se producen colisiones que hay que resolver. Los registros que se destinan a un mismo bloque se denominan sinónimos.

Hay varias técnicas para gestionar las colisiones:
 * Direccionamiento abierto. Cuando se produce una colisión, el sistema hace una búsqueda lineal a partir del bloque al que iba destinado el registro para encontrar un hueco donde insertarlo. Si se llega al final del fichero sin encontrar hueco, se continúa la búsqueda desde el principio.


 * Encadenamiento. En lugar de buscar un hueco libre, lo que se hace es disponer de una serie de bloques como área de desborde. Cuando se produce una colisión, el registro se sitúa en el área de desborde y mediante un puntero en el bloque colisionado, se apunta a la dirección del bloque de desborde y la posición relativa del registro dentro del bloque. Además, todos los registros que han colisionado en un mismo bloque se van encadenando mediante punteros.


 * Dispersión múltiple. Esta técnica de resolución de colisiones consiste en utilizar una segunda función de dispersión cuando la primera ha producido una colisión. El objetivo es producir una nueva dirección que no provoque colisión. Normalmente, la segunda función da una dirección de bloque situada en un área de desborde.

Aunque la dispersión es el método de acceso directo más rápido a través del campo de dispersión, no es muy útil cuando también se quiere acceder al fichero a través de otro campo. Ya que la mayoría de las funciones de dispersión que se utilizan no mantienen el orden entre los registros, tampoco es útil cuando se quiere leer los registros ordenadamente.

Buscar un registro a través de un campo que no es el de dispersión es tan caro como buscar un registro en un fichero desordenado: es preciso realizar una búsqueda lineal. Para borrar un registro hay que eliminarlo del bloque en el que se encuentra. Si el bloque tiene una lista de desborde, se puede mover un registro de la lista al bloque. Si el registro a borrar está en la lista de desborde, sólo hay que eliminarlo de ella. En este caso, será necesario mantener una lista enlazada de posiciones de desborde no utilizadas. Si al actualizar un registro se modifica el campo de dispersión, es muy probable que el registro tenga que cambiar de posición, por lo que habrá que borrarlo e insertarlo de nuevo.

Otra desventaja de la dispersión es que el espacio de almacenamiento es fijo, por lo que es difícil que el fichero se expanda o se comprima dinámicamente. Si el fichero tiene bloques y en cada uno caben registros, como máximo se podrán almacenar registros. Si hay menos de registros, quedará espacio sin utilizar. Si hay más de registros, habrá muchas colisiones y esto hará que el acceso sea más lento, ya que habrá largas listas de desborde. En este caso, puede ser preferible ampliar el espacio de almacenamiento y cambiar a otra función de dispersión, lo que implica que habrá que redistribuir todos los registros (reorganizar el fichero). Ya que el espacio de almacenamiento es fijo, a este tipo de dispersión se la denomina dispersión estática.

Hay varios esquemas que tratan de remediar esta situación: la dispersión dinámica y la dispersión extensible, que almacenan una estructura de acceso además del fichero, y la dispersión lineal, que no necesita dicha estructura.

Estas técnicas aprovechan el que las funciones de dispersión dan como resultado un valor entero no negativo que, por tanto, se puede representar como un número binario. Los registros se distribuyen entre los bloques teniendo en cuenta los primeros bits de este número, que se denomina valor de dispersión.