Almacenamiento y Recuperación de la Información Estructuras basicas de archivos Archivos Secuenciales 2do Semestre 2005 Wenceslao Palma M. <[email protected]> www.inf.utfsm.cl/~wpalma/ari Una estructura de archivos es una técnica para agrupar físicamente los registros de un archivo en dispositivos de almacenamieno secundario. Para escoger una estructura de archivo se consideran aspectos tales como: Características de los dispositivos de almacenamiento. Sistema operativo. Software para la administración de los archivos. Necesidades del usuario para almacenar y accesar datos. Criterios importantes: Acceso rápido para la recuperación de datos. Alto rendimiento para las transacciones de procesamiento. Uso eficiente del espacio en disco. Protección ante pérdida de datos y fallas. Minimización de la necesidad de reorganización de los datos. Lógicamente, un archivo es una colección de registros estructurados, generalmente, en torno a una clave. Esta organización de datos considera la visión del programador de aplicaciones sobre el archivo, la cual es independiente del dispositivo; interesa más su uso que sus atributos físicos. Dicho programador de aplicaciones es la persona que visualiza un archivo como una colección de registros lógicos, aplicándoles las siguientes operaciones: Recorrer el archivo Agregar registros al archivo Eliminar registros del archivo Modificar valores del archivo Ordenar el archivo En la organización lógica de una archivo, se distinguen dos conceptos importantes: a) Registro: corresponde a la definición de cada uno de los registros de datos que serán usados dentro de una aplicación, y cuya extensión determina el tipo de archivo que lo contiene, el cual puede ser: Archivo de Largo Fijo: el archivo se compone de registros del mismo tipo. Archivo de Largo Variable: El archivo se compone de registros del mismo tipo, pero al menos uno de los campos tiene un número de ocurrencias variable. El archivo se compone de registros del mismo tipo, pero el largo de al menos uno de sus campos es variable. El archivo se compone de registros del mismo tipo, pero uno de los campos es opcional en cuanto a su tipo. El archivo se compone de más de un tipo de registro. b) Campo o Atributo: ítem de dato que describe una característica de la entidad representada por un registro lógico. Este campo puede tener nombres como: Clave Candidata: atributo(s) que no soporta(n) valores repetidos, y que por lo mismo, puede(n) identificar en forma única a un registro dentro del archivo. Identificador o Clave Primaria:clave candidata escogida como clave de acceso principal al archivo, dado su constante uso en los accesos al mismo. Clave Alternativa: clave candidata que no es escogida como identificador. Clave Secundaria: atributo que permite valores repetidos. Clave Inteligente: atributo cuyo contenido permite derivar información adicional de la entidad a la cual pertenece. Los registros, compuestos de diversos atributos, se van a organizar entre sí, para formar lo que se entiende por un archivo. En general, las tres estructuras de archivos más comunes son la secuencial, la directa, y el esquema jerárquico (o de árbol). Archivos secuenciales Los registros son almacenados en secuencia, uno tras otro. Caracteristicas: Simple de usar. Conviene cuando se utilizan todos o la mayoria de los registros. El espacio de almacenamiento es minimo, solo se almacenan datos. El orden fisico y logico es el mismo. Existen dos tipos de archivos secuenciales: desordenado y ordenado. Archivos secuenciales desordenados Los registros se almacenan uno tras otro según orden de llegada. Búsqueda: se realiza en forma lineal. Inserción: al final del archivo, lo que hace que la operación sea rápida. Eliminación: se puede realizar de dos formas; física y lógica. Si la eliminación es física, será necesario un corrimiento de los datos, lo cual perjudica el rendimiento. Por el contrario si la operación es lógica se utilizan marcas de borrado. Sin embargo, en ambos casos, es necesaria una reorganización de los registros. Archivos secuenciales ordenados Los registros se almacenan en forma ordenada de acuerdo al valor de un campo (en la mayoria de los casos clave) de ordenamiento. Favorece la búsisqueda y generación de listados ordenados. Búsqueda: se realiza en forma lineal y binaria . Inserción: requiere un corrimiento de los registros para mantener el orden. Para evitar esto, existen varias técnicas: Incluir a cada bloque de datos un puntero que direccione a una lista enlazada de bloques de overflow, donde se almacenan los registros en dicha situación. Utilizar un archivo de overflow, el cual en cierta medida se transforma en un archivo de transacciones, para almacenar registros. Posteriormente se actualiza el archivo de datos mediante un ordenamiento y mezcla con el archivo de overflow. Eliminación: al igual que en el caso de los archivos secuenciales desordenados la eliminación puede ser física o lógica. Ordenamiento externo Los métodos de ordenamiento externo se aplican sobre archivos que no pueden ser almacenados completamente en memoria principal para su ordenamiento. Se habla de ordenamiento externo cuando se utiliza un proceso de dos fases: una de ordenamiento y otra de mezcla. La fase de ordenamiento toma datos del archivo (particiones) los deja en memoria principal, los ordena y los retorna al disco. Los registros quedan ordenados en forma relativa a la particion en donde se encuentran. En la fase de mezcla se mezclan las particiones generando particiones mas grandes hasta llegar a una sola: el archivo ordenado. Una variedad de operaciones se benefician de un conjunto de registros ordenados. Por ejemplo: Una consulta SQL podría requerir una salida ordenada de los registros que cumplen con alguna condición. Select Rut, Nombre, Dirección, Region From alumnos Order BY Region Al eliminar explícitamente duplicados Select DISTINCT ciudad From alumnos Debido a que no resulta razonable limitar el tamaño de un archivo. Cómo es posible ordenar los registros de un archivo cuyo tamaño es superior al espacio disponible en memoria principal? Para tal efecto se considera un proceso de ordenamiento y mezcla, mediante el cual el archivo a ordenar se divide y cada una de sus partes se ordena y mezcla con alguna otra hasta obtener el resultado esperado. Es posible realizar lo anterior en una modalidad conocida como dos vías (two­way) siempre que se cuente con 3 buffers en memoria principal. INPUT 1 OUTPUT INPUT 2 Disk Main memory buffers Disk La estrategia de solución es la siguiente: Paso 0. Se lee cada página del archivo. Para cada página se realiza un ordenamiento de sus registros. Se escribe cada página (run) ordenada hacia disco. Paso 1. Seleccionar 2 runs y llevarlas a memoria. Mezclar sus registros con respecto al criterio de ordenamiento. Escribir el resultado (run de 2 páginas) a disco. . . . . Paso n. Seleccionar y leer 2 runs escritas en el paso n­1 Mezclar sus registros con respecto al criterio de ordenamiento. Escribir el resultado (run de 2n páginas) a disco. En cada paso se leen/escriben las N páginas del archivo. El número de pasos es 1 + log2N 3,4 6,2 9,4 8,7 5,6 3,1 2 3,4 2,6 4,9 7,8 5,6 1,3 2 4,7 2,3 4,6 1,3 5,6 8,9 2 magnitud es O(NlogN) Si disponemos de una mayor cantidad de buffers se podría reducir el número de pasos. Qué sucede si se tienen B buffers? 2­page runs PASS 2 2,3 Cada paso involucra operaciones de I/O. La cantidad de operaciones de I/O es: 2N(1 + log2N), el orden de Input file PASS 0 1­page runs PASS 1 4,4 6,7 8,9 1,2 3,5 6 4­page runs PASS 3 1,2 2,3 3,4 4,5 6,6 7,8 9 INPUT 1 . . . INPUT 2 . . . OUTPUT . . . INPUT B­1 Disk Disk Considerando B buffers: Paso 0. Se generan N/B runs de B páginas cada una, excepto la última que menos. podría tener Paso 1.... Seleccionar B­1 runs del paso anterior. Realizar una mezcla de B­1 vías usando la B­ésima salida. página como buffer de Al igual que en el caso de 2 vías se escriben y leen las N páginas del archivo. En el paso 0 se escriben N/B runs. El número de pasos adicionales es logB­1N/B. Luego, el total de operaciones de I/O es 2N (1+logB­1N/B), el orden de magnitud es O(NlogN) pero en base B­1 N 100 1,000 10,000 100,000 1,000,000 10,000,000 100,000,000 1,000,000,000 B=3 7 10 13 17 20 23 26 30 B=5 4 5 7 9 10 12 14 15 B=9 3 4 5 6 7 8 9 10 B=17 B=129 B=257 2 1 1 3 2 2 4 2 2 5 3 3 5 3 3 6 4 3 7 4 4 8 5 4 Sin embargo, la forma en que se utilizan los buffers puede ayudar a reducir el costo de las operaciones involucradas. Considere un disco de 10000 páginas y espacio de almacenamiento en memoria principal de 64 páginas. El disco posee una latencia de 5ms, seek de 10ms y puede transferir una página en 1ms. Determine el tiempo requerido para ordenar el archivo considerando: Caso 1: 63 buffers de entrada de una página cada uno y un buffer de salida de una página. Caso 2: 3 buffers de entrada de 16 páginas cada uno y un buffer de salida de 16 páginas. Caso 3: 13 buffers de entrada de 4 páginas cada uno y un buffer de salida de 12 páginas. Sol.: Independiente de cada caso en el Paso 0 se leen 10000 páginas en grupos de 64 y luego se escribe cada grupo. Al final de este paso se generan 10000/64=157 runs de 63 páginas cada una. Caso 1: Paso 1: se generan 157/63=3 Paso 2: genera 1 run tiempo de cada paso: (10 + 5 + 1)*10000*2=320 seg tiempo total: 2*320= 640 seg Caso 2: Paso 1: 175/3=53 Paso 2: 53/3=18 Paso 3: 18/3=6 Paso 4: 6/3=2 Paso 5: 2/3=1 tiempo por cada paso: (10+5+(1*16))*2*(10000/16)=38.75 seg tiempo total: 5*38.75=193.75 seg Caso 3: Cantidad de pasos: log13175=2 :­) tiempo por cada paso: como el buffer de entrada es distinto es necesario calcular el tiempo de lectura y escritura por paso. t_lectura: (10+5+(1*4)*2*(10000/4)=47.5 seg t_escritura: (10+5+(1*12)*2*(10000/12)=22.52 seg tiempo total: 2(t_lectura+t_escritura)=140.04 seg Archivos organizados como árboles Los registros se organizan en bloques los cuales se relacionan en forma jerárquica de acuerdo a un cierto orden entre los valores que contiene cada registro. Arboles Binarios La gran ventaja es que permiten búsqueda binaria, pero los tiempos de recuperación se ven afectados por un eventual desbalanceo. reg<clave clave + registro completo reg>clave Arboles Multiway Corresponden a una generalización de un árbol binario. En lugar de un registro y 2 punteros, un nodo contiene R registros y R+1 punteros. Los tiempos de recuperación mejoran, pero se requieren operaciones de balanceo al insertar y eliminar un registro. La estructura de un nodo: P0 K0 P1 K1 P2 K2 ................... Pn­1 Donde: P0........Pn son apuntadores a nodos de subárboles. K0.........Kn­1 son los valores de las claves. Los valores de las claves en un nodo estan en orden ascendente Ki<Ki+1 Kn­1 Pn Todos los valores de las claves que estan en los nodos del subárbol apuntado por Pi son menores al valor de la clave Ki. Todos los valores de las claves que estan en los nodos del subárbol apuntado por Pn son mayores al valor de la clave Kn­1. Los subárboles apuntados por Pi también son árboles de búsqueda de m­vías. Construya un árbol de 3 vías dada la siguiente secuencia 50­100­20­40­15­30­70­120­140­130­136 Arboles B Corresponden a árboles multiway con operaciones de balanceo, es decir, son multiway balanceados. Se define un árbol B de orden m a aquél árbol que cumple con las siguientes condiciones: ● ● ● Ningún nodo tiene más de m hijos. Un nodo interno con k hijos contiene k­1 registros. Todos los nodos terminales se encuentran en el mismo nivel. Ejercicio: Suponga un archivo de 40000 registros organizado como árbol B. El tamaño de cada registro es 70 bytes. Si el disco donde se almacena utiliza bloques físicos de 1KB y punteros a bloque de 6 bytes. Cuál es el orden del árbol? Cuantos accesos a disco se necesitan como máximo para recuperar un registro si en promedio los nodos estan llenos en un 70%? Cuanto tiempo en i/o se necesitan para la operación anterior? Considere un disco con los siguientes parámetros; seek:18ms , latencia: 8.3ms, transferencia: 1229 bytes/ms Archivos Directos Veremos los relacionados a Direccionamiento Indirecto. El Direccionamiento Directo es un direccionamiento algorítmico. La idea general es alcanzar un registro usando una función de transformación (hashing) sobre una clave (que identifica de manera única a cada registro), lo cual llevará a la posición del registro en el medio de almacenamiento. El espacio de almacenamiento es dividido en secciones llamadas buckets. Un bucket almacena uno o más registros en casilleros de tamaño fijo llamados slots. Bucket registro1 slot registro2 registro3 registro4 La cantidad de registros en un Bucket define el factor de bloqueo (fb). La función hashing transforma la clave en una dirección de bucket relativa. Se almacena una tabla en el encabezado del archivo para mantener una correpondencia con los bloques físicos. Este enfoque posee 2 desventajas: (a) Colisiones: para registros con distinta clave es posible que la función de transformación entregue un mismo valor. Es necesario resolver las colisiones ya que pueden generar overflow. (b) Zona de áreas muertas: la función distribuye de forma no equitativa los datos entre los distintos buckets. Alternativas para resolver colisiones (a) Overflow Abierto: en este caso la idea es almacenar el registro que está en colisión en el siguiente slot disponible. Ventaja: Minimización de áreas muertas. Desventaja: Búsqueda lineal de registros en colisión. (b) Encadenamiento: en este caso un bucket sirve como nexo hacia un bucket de overflow cuando sea necesario. Existen dos tipos de encadenamiento: ● ● Unificado: bucket de overflow es compartido por varios buckets que tienen overflow. Exclusivo: cada bucket tiene potencialmente un bucket de overflow exclusivo. Overflow registro1 registro2 registro3 registro1 Overflow registro2 registro3 Overflow registro4 registro4 registro5 registro5 registro6 registro6 Overflow Unificado Overflow Exclusivo Todo lo anterior implica: ● ● Un espacio de direcciones fijo. Lo normal es que los archivos cambien. Idea: Proponer un mecanismo que permita la expansión dinámica del archivo. Hashing Dinámico idea: llegar a los datos por medio de estructura de acceso jerárquica. Características: ● El número de buckets no es fijo. ● Se puede partir con un solo bucket. ● Cuando un bucket se encuentra en overflow se divide en dos buckets considerando como criterio de división el valor del bit más significativo de lo entregado por la función de transformación. En este caso se crea una estructura de árbol o directorio. Existen 2 tipos de nodo: nodo interno: guían la búsqueda. nodo hoja: apuntan hacia un bucket. 0 1 nodo nodo interno hoja Ejemplo: Suponer buckets con fb=4. Crear un archivo directo en base a: 7 41 21 48 43 6 16 15 42 25 18 20 000111 101001 010101 110000 101011 000110 010000 001111 101010 011001 010010 010100 7 41 21 48 43 6 16 15 42 25 18 20 000111 101001 010101 110000 101011 000110 010000 001111 101010 011001 010010 010100 7 41 21 48 Al ingresar 43 el bucket entra en overflow. Además, es posible ingresar 6 y 16 sin problemas. 7 21 0 6 16 1 41 48 43 7 41 21 48 43 6 16 15 42 25 18 20 000111 101001 010101 110000 101011 000110 010000 001111 101010 011001 010010 010100 Al ingresar 15 hay overflow!! 7 6 0 0 15 1 21 1 16 25 41 18 48 43 42 Además, es posible ingresar 42, 25 y 18 sin problemas. 7 41 21 48 43 6 16 15 42 25 18 20 000111 101001 010101 110000 101011 000110 010000 001111 101010 011001 010010 010100 Al ingresar 20 hay overflow!! 7 6 0 0 15 1 0 1 21 16 1 41 48 43 42 18 20 25 Hashing Extendido Idea: Considerar una estructura de acceso tipo arreglo. Características: ● ● ● ● ● La estructura de acceso es un arreglo de 2^d direcciones de buckets. d es la profundidad global del directorio. Se suponen buckets de tamaño fijo. En caso de overflow es necesario doblar el tamaño del directorio. La estructura de acceso se construye considerando el bit menos significativo. Ejercicio: Considerando las siguientes transformaciones de claves, Construya un archivo utilizando hashing extendido. ed tom sam ann kim kely mindy mark chris laura sue jill amy Inicialmente d=0. fb=4. ed .....1010 tom .....1000 sam .....0100 ann .....0001 111010001010 001101101000 111100010100 010011010001 100111010100 011011011110 110111000101 110001011001 111001110011 001011010101 101110001100 111000110010 111000011101 ed tom sam ann kim kely mindy mark chris laura sue jill amy 111010001010 001101101000 111100010100 010011010001 100111010100 011011011110 110111000101 110001011001 111001110011 001011010101 101110001100 111000110010 111000011101 Al agregar kim existe overflow. El tamaño del directorio se debe doblar. d=1 0 1 ed tom sam . .....1010 .....1000 ....0100 kim .....0100 ann .....0001 ed tom sam ann kim kely mindy mark chris laura sue jill amy 111010001010 001101101000 111100010100 010011010001 100111010100 011011011110 110111000101 110001011001 111001110011 001011010101 101110001100 111000110010 111000011101 Al agregar kely hay overflow. Ahora d=2 tom .....1000 sam .....0100 kim 00 01 .....0100 ed .....1010 kely .....1110 10 11 ann mindy .....0001 .....0101 mark .....1001 chris .....0011 Además, es posible agregar mindy, mark y chris sin problemas!!! ed tom sam ann kim kely mindy mark chris laura sue jill amy 111010001010 001101101000 111100010100 010011010001 100111010100 011011011110 110111000101 110001011001 111001110011 001011010101 101110001100 111000110010 111000011101 Al agregar laura hay overflow. Sin embargo, no es necesario doblar el directorio sino crear un nuevo buket Además, es posible agregar sue y jill sin problemas!! tom .....1000 sam .....0100 kim .....0100 sue 00 01 .....1100 ed .....1010 kely .....1110 jill .....0010 10 11 ann mindy mark .....0001 .....0101 .....1001 laura .....0101 chris .....0011 ed tom sam ann kim kely mindy mark chris laura sue jill amy 111010001010 001101101000 111100010100 010011010001 100111010100 011011011110 110111000101 110001011001 111001110011 001011010101 101110001100 111000110010 111000011101 tom .....1000 sam .....0100 kim .....0100 sue 000 001 .....1100 ed .....1010 kely .....1110 jill .....0010 010 011 ann mark .....0001 .....1001 100 101 110 mindy .....0101 laura .....0101 amy .....1101 111 chris.....0011 Hashing Lineal ● ● ● No considera una estructura de acceso tipo índice. Su uso se basa en la existencia de M buckets, numerados desde 0 hasta M­1, los cuales van recibiendo registros de acuerdo a una función hashing h0 . En el momento en que alguno de los buckets se llena, se crea un bucket M en el cual se reparten los datos del bucket 0, aplicando la función hashing h1. Este esquema se sigue repitiendo a medida que el archivo crece de tamaño. Criterios para la selección de la estructura de un archivo En algunas aplicaciones es evidente cuál organización y método de acceso son los más adecuados. Sin embargo conviene tener presente algunos criterios para hacer una selección más fundamentada. Actividad Número de registros del archivo usados en un proceso. Cuando la actividad es alta se recomienda un archivo secuencial, en caso contrario acceso directo. Volatilidad Número de registros insertados o eliminados en un archivo. Si la tasa de volatilidad es alta se recomienda un archivo secuencial desordenado para que los nuevos registros vayan quedando almacenados al final. Tipos de consultas Simple: depto='informatica' Rango: sueldo>1000000 Lógica: depto='informatica' y sueldo>1000000 Patrones: depto='ing%' En consultas simples conviene un archivo secuencial ordenado sobre el atributo de la consulta, favorece búsqueda binaria, también puede ser directo o de tipo árbol si la clave es única. Para rango es aconsejable secuencial ordenado sobre el atributo de consulta y esquemas directos que preserven el orden. En consultas lógicas dependerá si los componentes son simples o rangos. Para búsqueda de patrones las posibilidades son las mismas que para las consultas simples. Volumen del archivo Número de registros que componen el archivo. Si el número es alto entonces archivo directo, de lo contrario secuencial.