Almacenamiento y Recuperación de la Información

Anuncio
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.
Descargar