Está en la página 1de 57

Listas de disponibles.

Índices
M. Oscar F. D’Cuire Galeano
Objetivos
• Listar las diferentes características de los
archivos de longitud fija y de longitud.
• Contrastar la utilización de índices versus la
no utilización de los mismos.
Contenido
• Repaso
• Operaciones sobre archivos
– Archivos Longitud Fija – Recuperación dinámica de
espacio
– Archivos Longitud Variable – Eliminación
– Fragmentación
• Índices
– Primario
– Secundario
Repaso
Mantenimiento de un archivo
• Con el fin de optimizar el desempeño de la
manipulación de un archivo, es necesario
conocer cual es el mantenimiento que se le
dará a ese archivo:
– Frecuencia Escritura
• Inserciones o nuevos registros
• Eliminaciones
• Respaldos
– Frecuencia Lectura (consulta)
• El mantenimiento es importante porque con
el tiempo el desempeño se va deteriorando.
Ejemplos prácticos
Tipo de Procesamiento Frecuencia de Ejemplo Características
actualización

En línea Inmediata / Cuasi Saldo en cuenta de bancos Se requiere de una


inmediata respuesta inmediata por
Reservaciones de boletos parte de algún usuario.
aéreos

Habitaciones en un hotel

Tiempo real Inmediata Alarmas de casa El correcto funcionamiento


depende de los resultados,
Edificios inteligentes como una reacción a los
eventos generados por
HW.

Distribuido Variable Internet Se distribuye la carga entre


varios hosts. Acelera el
Videoconferencias-chat tiempo de ejecución,
dividiendo en trozos.
Multiprocesadores.

Lotes o batch Esporádica Generación de respaldos

Listas de correos

Ejecución de software de
monitoreo
¿Qué hacer frente a situaciones
extraordinarias?
• Ejemplo:
– Archivo con registros de longitud variable
– Se elimina un registro
– ¿Dónde insertaría un nuevo registro?
Compactación
• El proceso que consiste en la
redistribución del espacio dentro del
archivo con el fin de aprovecharlo al
máximo.
• Para ello:
– Identificar los registros eliminados
– Marcar los registros antes de eliminarlos (la
idea es dar opción a poder recuperar
información)
– Reutilizar el espacio
Compactación
• Identificación del registro
– Borrar (Lopez, Pedro)

• Marcar el registro
Importancia de un buen diseño
desde el inicio
• ¿Es posible pasar de

¿Cuántos bytes se pierden del primer registro?


¿Cuántos bytes se pierden del segundo registro?
¿Cuántos bytes se perderán del registro n? 2(n-1)
Compactación
• Reutilización del espacio
– ¿Es recomendable hacer el borrado inmediatamente?
• No, posibilidad de recuperar información
– Al ser marcados, el borrado es lógico
• Las consideraciones deben hacerse en el programa por el desarrollador
• El borrado lógico implica que el registro no será visto por los usuarios
– Eventualmente, el archivo es compactado
• Se busca recuperar el espacio utilizado por los registros
• Se reconstruye el archivo ya sin registros eliminados
• Copia a otro archivo ignorando registros eliminados

• La frecuencia para compactar dependerá de la necesidad de utilizar


el espacio libre
– Establecer fechas en calendario
– Realizarlo al llegar un determinado número de registros
– Analizar la volatilidad (I/O)
Eliminación – Registros de
Longitud Fija
• Archivo con registros de longitud 50 bytes

• El proceso es muy lento. ¿Que puede hacerse?


Recuperación Dinámica del
Espacio (L. Fija)
• Permitirá conocer si hay algún lugar vacío
• Permitirá acceder directamente a uno de esos lugares
• Implementación
– Lista Enlazada
– Se tiene una referencia al primer nodo de la lista, la cual puede
recorrerse examinando cada nodo y luego el campo apuntador
del nodo, de manera que se sepa donde está el siguiente

Apuntador Registro Registro


(7) -1
Inicial (4) #4 #7

• Una lista compuesta de registros eliminados que se han


convertido en espacio disponible se llama lista de disponibles.
• -1: indica el final de la lista: ya no hay mas elementos
Recuperación Dinámica del
Espacio (L. Fija)
Apuntador
Registro Registro
Inicial (4) #4 (7) -1
#7

• Si se elimina un registro, se crea un nuevo nodo en el inicio

Apuntador Registro Registro Registro


#8
(4) (7) -1
Inicial (8) #4 #7

• Si se adiciona un registro, se busca el espacio en el último nodo


que fue agregado
Apuntador Registro Registro
(7) -1
Inicial (4) #4 #7

• ¿Qué estructura de datos puede utilizarse para esta


representación?
– PILA, Analice porqué….
Recuperación Dinámica del
Espacio (L. Fija)
• Algunos apuntes sobre la lista de disponibles (L.
Fija):
– Un registro que apunte a -1, representa el ultimo registro
disponible para grabar información.
– Toda lista de disponibles debe tener un registro inicial. El
registro inicial hace referencia al último elemento eliminado del
archivo, por ende el último elemento agregado a la pila y que
deberá ser el primer elemento que se considere al momento de
agregar un nuevo registro.
– La flecha indica el siguiente número de registro que se
encuentra disponible
• En el ejm. Después del registro 8, el siguiente
registro disponible es el número 4.
Registro
(4)
#8
Ejercicio
• ¿En que posición se insertaría un nuevo registro?
– Registro Inicial: 7

• Si se elimina el registro Juan, ¿cómo quedaría


conformada la pila?

• ¿Dónde y en que orden se insertarían tres nuevos


registros?
– Registro inicial: 5
Ejercicio
• ¿Qué representa la siguiente lista de
disponibles?
– Registro inicial: -1
Eliminación – Registros
Longitud Variable
• Implementación
– Registros eliminados se identificarán con un *
– Seguido de la dirección en la cual se
encuentra el próximo registro eliminado
(espacio)
– Ejm.
• Se elimina el registro Chi|Mario….

• Registro inicial: 128 (59 + 2 + 2 + 61 + 2 + 2 )


Eliminación – Registros
Longitud Variable
• Implementación
– La lista de disponibles ya no hace referencia
a números de registro, la referencia se hace a
lugares específicos dentro del archivo
– Ejm.

– Por lo tanto la lista se podría representar así:


• Registro inicial: 128
Apuntador Size: 39 -1
Inicial (128)
Inserción – Registros de
Longitud Variable
• ¿Por qué no es posible implementar una pila(como en los
registros de longitud fija)?
– Variación de tamaño: no hay garantía de que el registro a
insertar mide lo mismo que el registro eliminado
• ¿Por qué no insertamos solamente al final?
– Desperdicio de espacio al interior de cada archivo.
• Condiciones para insertar un registro en un espacio de un
registro eliminado:
– El registro tiene que haber sido eliminado
– El espacio dejado por el registro eliminado debe tener el tamaño
correcto (lo suficientemente grande para el registro nuevo)
• Proceso:
– Buscar en la lista un registro de tamaño correcto
– Si se llega al final de la lista de disponibles sin encontrar un
registro lo suficientemente grande, se debe insertar al final.
Lista de Disponible – Longitud
Variable
• Un registro que apunte a -1, representa el último registro
disponible para grabar información.
• Toda lista de disponibles debe tener un registro inicial. El
registro inicial hace referencia al último elemento eliminado
del archivo, por ende el último elemento agregado a la pila y
que no necesariamente será el primer elemento que se
considere al momento de agregar un nuevo registro. Esto
dependerá de la longitud del registro a ingresar.
• El cuadro representa la longitud del registro señalado por la
flecha.
• La flecha representa la posición en la que se encuentra el
siguiente registro disponible dentro del archivo.
– En el ejm. Después el registro que se encuentra en la
posición 130, mide 45 bytes. Luego le sigue el registro que
se encuentra en la posición 40.
Apuntador Size 45 40
Inicial (130)
Listas de disponibles. Índices
M. Oscar F. D’Cuire Galeano
Objetivos
• Listar las diferentes características de los
archivos de longitud fija y de longitud.
• Contrastar la utilización de índices versus la
no utilización de los mismos.
Contenido
• Repaso
• Operaciones sobre archivos
– Fragmentación
• Índices
– Primario
– Secundario
Repaso
• ¿Qué es una lista de disponibles?
• Al ingresar un registro en un archivo de
datos, ¿la lista de disponible aumenta o
disminuye?
• Estructuras que pueden utilizarse para
manejar la lista de disponibles de
– Archivos de longitud fija
– Archivos de longitud variable
Repaso
• ¿Cómo se podrían representar los
espacios de la siguiente lista de
disponibles?
– Registro inicial: 130
Apuntador
Size 45 40 Size 38 190 Size 72 300 Size 68 -1
Inicial (130)

Apuntador
Size 45 40 Size 38 300 Size 68 -1
Inicial (130)

• ¿Qué pasa si se inserta un registro con longitud 50?


Repaso
Apuntador Registro Registro Registro
(4) (7) -1
Inicial (8) #8 #4 #7

Apuntador Registro Registro


(7) -1
Inicial (4) #4 #7
Fragmentación
• Fragmentación Interna:
– Desperdicio de espacio

• En un archivo de registros fijos:


– Cuando se almacenan registros con una
longitud menor a la del registro
Fragmentación
• En un archivo de registros variables:
– Cuando se almacena un registro en un espacio
mas grande

• Se busca minimizar la fragmentación interna:


– R. Fijos: definiendo una longitud lo mas
aproximada a la utilizada por los registros.
– R. Variable: se minimiza la fragmentación interna
al escribir el archivo la primera vez
Fragmentación

Apuntador
Size 45 40 Size 38 190 Size 68 -1
Inicial (130)

• ¿Se podría almacenar un registro de


longitud 140 ?
• El espacio está en la lista de disponibles (45+38+68= 151), no
dentro de un registro, pero esta demasiado fragmentado para
utilizarse.
• Este es un caso de Fragmentación Externa
Estrategias de colocación
• La manera en que se asignará el espacio a los registros nuevos:
• Primer ajuste
– Se busca desde el inicio de la lista hasta encontrar uno suficientemente
grande
– Mínima cantidad de trabajo
– No se preocupa por la exactitud
• Mejor ajuste
– Se ordena ascendente
– El primer registro encontrado del tamaño suficiente seria el que menos
desperdicia
– Desventaja se busca al agregar y al eliminar
• Peor ajuste
– Se ordena descendente
– Se toma el primero, el más grande
Indexación
• Técnica para recuperar los datos contenidos en un archivo o en una zona
de memoria por medio de un índice que guarda la posición de los datos.
• Un índice es aquel que permite imponer un orden en un archivo sin
que realmente se reacomode. Así no solamente se evita desacomodar los
registros, si no que también los costos de aspectos como la adición de
registros son mucho menores que en archivos clasificados.
• Ejemplos de índices

– Directorio telefónico, Índice de un libro,


Catálogo de una tienda, etc…
Clasificación de Índices
De acuerdo al campo llave que se utiliza:
• Índice primario
– Un índice primario o simple es aquel que guarda únicamente la llave primaria,
identificando de forma única a un registro almacenado en un archivo. El índice
guarda el campo clave y la dirección física del archivo. El archivo guarda los
registros sin orden establecido.
• Llave primaria: un campo o combinación de campos que identifica de manera única un
registro.
• Índice secundario
– Un índice secundario es el que está compuesto por la dupla: llave secundaria y
llave primaria. Como varios registros pueden contener el mismo valor en la llave
secundaria, existirán múltiples entradas en el índice secundario por cada posible
valor de la llave secundaria.
• Llave secundaria: Un campo o conjunto de campos que no necesariamente identifican
un registro, pero es útil para relacionar la información o procesarla en un orden
específico.
Clasificación de Índices
De acuerdo a la relación del campo llave con
los registros en los datos:
• Denso
– Cuando existe un registro en el archivo índice
para cada uno de los registros de los archivos de
datos.
• Disperso
– Cuando existe un registro en el archivo de índice
sirve para ubicar la posición de un bloque de
registros (normalmente un registro en el índice
apuntará al primer registro del bloque)
Clasificación de Índices
Ciudad Pos
LCE 3
LCE 5
LCE 9
LCE 10
PRO 4 Ciudad Codigo
PRO 6 LCE 5411
Codigo Posicion Pos Codigo Letra Ciudad LCE 6432
PRO 7
875 14 1 2127 A TGU
PRO 8 LCE 7722
2 5434 B SPS
964 8 SPS 2 LCE 9326
3 7722 C LCE
1194 11 SPS 11 PRO 964
4 8211 D PRO
2127 1 5 9326 B LCE SPS 12 PRO 2271
2271 7 6 4438 F PRO SPS 14 PRO 4438
2950 16 7 2271 D PRO TGU 1 PRO 8211
4438 6 8 964 A PRO
TGU 13 SPS 875
9 5411 F LCE
5411 9 TGU 15 SPS 1194
10 6432 D LCE
5434 2 TGU 16 SPS 5434
11 1194 C SPS
5749 12 5749 D SPS SPS 5749
12
6432 10 13 9483 A TGU TGU 2127
7722 3 875 B SPS Ciudad Pos
14 TGU 2950
8211 4 15 9529 F TGU LCE 3
TGU 9483
9326 5 16 2950 C TGU LCE 10
TGU 9529
9483 13 PRO 4

9529 15 PRO 8
SPS 2
SPS 14
TGU 1
TGU 16
Índices Primarios o Simples
• Para implementar la utilización de índices se requiere:
– Archivo de Datos: el archivo que tiene todos los registros
– Archivo de Índices: el archivo donde se almacenan los índices del
archivos
• Un archivo mas pequeño
• Normalmente de longitud fija
• Se impone un límite en la cantidad de llaves
• El archivo de índices contiene la siguiente información:
– Campo llave (o clave): un identificador que debe ser único para cada
registro. (Ejm. Identidad, número de cuenta, código de producto, etc…)
– Posición en el archivo:
• Longitud variable / fija : la ubicación (número de columna) donde inicia el registro
• Longtud fija: número de registro (se puede calcular la posición exacta
conociendo el tamaño de cada registro)
• Adicionalmente se podría incluir otros campos como:
– Longitud: el tamaño en bytes del registro en el archivo de datos.
– Fecha de última modificación
Índices Primarios o Simples
• En este ejemplo, asumimos que
trabajamos con registros de longitud fija
(ejm 100 bytes por registro).
– El archivo de datos se encuentra
desordenado.
– El archivo de índices debe encontrarse
ordenado.
• En este archivo se podrá ver dos columnas
(campo llave, dirección donde inicia el registro)
Algunas consideraciones al
utilizar índices simples
• Un archivo de índices debe ser mas fácil de manejar ya que normalmente debería
ser mas pequeño que el archivo de datos.
• Debe tenerse cuidado al momento de definir el campo que será utilizado como llave.
Ejm. Si se el campo llave a utilizar será identidad, no puede definirse un campo con
5 caracteres.
• La idea de utilizar índices simples es hacerlo con archivos de datos que no tengan
demasiado información
– ¿Por qué? De esta manera el archivo de índice puede ser cargado en memoria
(haciendo que el acceso al mismo sea mas rápido)
• Para cargar el archivo en memoria se puede considerar la utilización de arreglo
INDICES[], con al menos dos columnas (llave, posición en el archivo).
• El tener el archivo en memoria nos permitirá acceder a él mas rápido y por ende
podremos detectar la dirección del registro y acceder mas rápido al archivo de datos
con el registro.
– Cada lenguaje de programación tiene sus comandos específicos para copiar
datos en memoria.
– Ejm. memcpy ( C )
Operaciones con índices
simples
• El trabajar con índices simples nos obliga a
analizar las siguientes operaciones:
1.Crear archivos originales de índices y de datos.
2.Cargar el archivo de índices en memoria antes
de usarlo.
3.Reescribir el archivo de índices cuando se realice
un cambio en memoria.
4.Agregar registros al archivo de datos e índices.
5.Eliminar registros del archivo de datos.
6.Actualizar registros del archivo de datos.
Creación de archivos originales
de índices y de datos
• Se deben crear los archivos como se hace
normalmente.
• Es una operación relativamente fácil.
• En el archivo de índices algunas veces se reservan los
primeros bytes para el “encabezado”
– Encabezado: información especial que define función de un
archivo, dentro de la cual se pueden citar algunos atributos:
cantidad de registros, última fecha de modificación, autor, etc…

ARCHIVO ARCHIVO
DATOS INDICE
Carga de archivos de índices en
memoria
• Utilizar un arreglo INDICES[] para copiar la información
del archivo de índices en memoria.
• Las funciones para copiar valores a memoria varían de
acuerdo al lenguaje de programación utilizado.
– Ejm. Memcpy (c++)

ARCHIVO
INDICE[ ]
INDICE
Reescritura del archivo de índices
después de realizar un cambio en
memoria
• Una vez que se haga alguna modificación en INDICES[]
se debe buscar el mecanismo para grabar esos cambios
en el archivo de índices.
• Prever que puede pasar en caso de interrupciones
eléctricas (incongruencia entre archivo de índices e
INDICES[])
– Buscar un método para reconstruir el archivo de índices a partir
del archivo de datos.
– Utilizar alguna bandera para indicar que INDICES[] y archivo
índices están sincronizados
ARCHIVO
INDICE
INDICE[ ]
Agregar nuevos registros
• Si se agregan registros al archivo de datos
debe agregarse un registro a INDICES[]
• Al modificar INDICES[] debe modificarse
también el archivo de índices.

ARCHIVO ARCHIVO
DATOS
INDICE[ ] INDICE
Eliminación de registros
• Utilizar las técnicas ya vistas (borrado
lógico / físico).
• El índice del registro también tiene que ser
afectado, primero eliminando el registro de
INDICES[], luego actualizando el archivo
de índices.
ARCHIVO ARCHIV
DATOS
INDICE[ ]
O INDICE
Actualización de registros
• Hay dos posibles escenarios:
– Modificar un campo que no es llave
• No afecta el índice
• Solo se modifica el archivo de datos.
– Modificar solo el campo llave
• Realizar el cambio en el archivo de datos
• Realizar el cambio en INDICE[]
• Reacomodar INDICE[] si fuera necesario
• Actualizar el archivo de índices con los cambios
• Ejm. Si en el ejemplo se modifica el registro con la llave
4146165, con la nueva llave 58541010 INDICE[] y el
archivo de índices deberían de pasar de:

Se cambia el valor de la
llave y se reacomoda el
archivo de índices. La
posición del registro no
cambia.
Índices Secundarios
• Surgen como una opción cuando se tienen archivos
con grandes volúmenes de información.
• Cuando se busca un libro en una biblioteca le
decimos a la bibliotecaria ¿Tiene el libro de
estructura de datos ? le decimos ¿Tiene el libro
código CD4587986X-23?
• Por lo general no buscamos la información por llaves
primarias, si no por descriptores que pueden ser
nombres o palabras clave. Esto es lo que se conoce
como llaves secundarias.
Indices Secundarios
• Para implementar un índice secundario,
agregamos a la estructura de índice
primario o simple un tercer archivo:
archivo de índice secundario.
Índice
Índice Primario:
Secundario: ordenado
ordenado por código
por ciudad

Datos: en
desorden
Indices Secundarios
• El índice secundario se compone de:
– Clave secundario (un campo que no necesariamente identifica
exclusivamente a un registro y cuyo valor puede repetirse en varios
registros)
– Llave primaria (identificador único de cada registro)
• Algunas operaciones con índices secundarios:
– Agregar registros: también hay que agregar el nuevo registro en el
archivo de índices primario y en el archivo de índice secundario
– Eliminar registros: se debe eliminar del archivo de índices y del
secundario, para ambos casos hay que reacomodar el archivo.
– Actualizar registros:
• Campo no llave: solo afecta archivo de datos.
• Campo llave secundaria: afecta archivo de datos, y archivo de índice secundario.
Este último debe reacomodarse.
• Campo llave primaria: afecta archivo de datos, archivo de índice primario y archivo
de índice secundario. Los dos deben reacomodarse
Desventajas de los índices
secundarios
• Hay que reacomodar el archivo secundario cada
vez que se inserte un nuevo registro al archivo de
datos, aún y cuando ya haya algún registro que
tenga esa llave secundaria.
– Si hay llaves secundarias duplicadas, el campo de
llave secundaria se repite para cada registro en el a.
de índices secundarios. Esto desperdicia el espacio y
dificulta que sea cargado en memoria.
• Una solución puede ser:
– Cambiar la estructura del índice secundario
– Asociar un arreglo de referencias con cada llave
secundaria.
Asociando varias claves
primarias a una llave
• Siguiendo el ejemplo
secundaria

• Algunos problemas con esta implementación:


– Hay un número limitado de llaves primarias por cada secundaria.
– ¿Qué pasaría si se ingresa un nuevo registro con la clave secundaria TEG?
• Habría que buscar la manera de enlazar ese nuevo registro y los subsiguientes con el
registro actual con los cuatro códigos iniciales.
– Hay desperdicio de espacio, ya que para las llaves secundarias CHO, LCE, PRO,
SPS hay 2, 2, 3 y 3 espacios sin utilizar.
Índice secundario
reestructurado
• Una solución para esto es implementar el índice
secundario a través de una lista invertida.
• Son listas invertidas porque “retrocedemos” del
índice secundario al primario, y de éste al dato.
• Es una estructura dinámica donde se tiene un
apuntador a la primera referencia de llave
primaria.
Ejercicio
• Considere el siguiente problema:
– Una tienda de abarrotería cuenta con al menos mil productos. Históricamente se han
almacenado algunos datos relacionadas con las ventas de productos dentro de la
tienda. Se dispone de la información de cada factura de cada cliente. Considere que
en una factura un cliente puede tener registrado uno o mas productos.
– El dueño de la tienda está interesado en conocer la siguiente información:
• Detalle de facturas para un cliente en particular
• Información de un cliente (código de cliente, nombre, ultima factura)
• Cantidad de facturas para un cliente en particular
• Cantidad de un producto en particular, total de venta de ese producto en una factura en
particular
• Cantidad de producto vendido para todos los clientes
• Cantidad de producto vendido, total de ventas para un cliente en particular
– En vista de lo anterior, se pide:
• Identificar posibles datos de un archive de datos (campo / tipo de datos (varchar, int, float,
etc..)) Asuma que todos los datos se almacenan en un solo archivo.
• Identificar posibles índices primarios
• Identificar posibles índices secundarios
• ¿De que manera utilizaría los índices para realizar las consultas mencionadas en la primer
parte del problema? Ventajas / Desventajas del índice seleccionado
• ¿De que otra manera podrían organizarse la información si el archivo de datos se distribuyera
en dos o mas archivos? ¿Cómo cambian los índices?
Conclusiones
• Manejar las diferencias entre archivos de longitud fija y variable nos permite
determinar cual es el mejor enfoque según la aplicación a desarrollar.
• Disminuir la fragmentación interna y externa debe ser un objetivo en
cualquier implementación.
• El desarrollo de Índices sirve para dar solución al problema de acceso a
registros específicos dentro de un archivo de datos.
• Las estructuras de índices son estructuras complejas que se utilizan en
archivos y en memoria dinámica.
• La utilización de índices secundarios dependerá de la complejidad de los
archivos de datos.
• Por lo general al trabajar con índices se hará mención de:
– Archivo de datos
– Archivo índice
– Arreglo de índices
• 14 de mayo
– Tarea # 3 / Foro # 1
• 17 de mayo
Actividades
Pendientes – Tarea Formativa 4
• 18 de mayo
– Examen I Parcial Presencial TGU
y SPS
• 19 de mayo
– Tarea Formativa 1 / Wiki / Tarea
Formativa 3
• 21 de mayo
– Tarea # 4
• 22 de mayo
– Proyecto de Clase

También podría gustarte