You are on page 1of 35

ARQUIVOS INDEXADOS

Rodrigo Richard Gomes

Arquivos Indexados

A organizao de um arquivo deve ser definida em termos das 4 operaes bsicas


Incluso

de novos registros Excluso de registros existentes Alterao de registros existentes Pesquisa de registros

Arquivos Indexados

Incluso
A

eficincia na incluso fcil de ser obtida, desde que no haja movimentao de registros. Basta inserir os novos registros no final do arquivo pesquisa, entretanto, se torna lenta pois, para se obter um registro com uma chave especfica, necessrio realizar uma leitura sequencial exaustiva do arquivo

Pesquisa
A

Arquivos indexados

Para garantir rapidez na pesquisa, pode-se usar uma estrutura de indexao Essa estrutura reduz o nmero de acessos a disco, j que a chave seria procurada nesta estrutura, mantida na memria principal do computador, e no haveria compromisso com a ordem fsica do arquivo

Arquivos Indexados

O termo chave utilizado para designar o campo de um registro que ser utilizado no processo de localizao de um registro dentro de um arquivo Desta forma, ser possvel acessar um determinado registro diretamente, sem nos preocuparmos com os registros que o antecedem
Exemplo:

em um cadastro de funcionrios, poder ser utilizado o campo matrcula como sendo a chave para a manipulao do mesmo

Arquivos Indexados

Um ndice um mapeamento que associa a cada chave, uma referncia ao registro que a contm Assim, dada uma chave de pesquisa, o ndice fornece imediatamente a localizao do registro correspondente
RRN

(relative record number) ou offset

Arquivos indexados

Alterao
O

processo de atualizao, considerando a existncia do ndice, tambm ser rpido Dada a chave do registro que deve ser alterado, pode-se acess-lo rapidamente e gravar as novas informaes

Arquivos Indexados

Excluso
Se

um registro tiver que ser removido, basta remover sua referncia do ndice (remoo lgica) Uma excluso efetiva (fsica) ocorreria somente durante o processo de reorganizao do arquivo, quando uma cpia dele seria gerada, contendo apenas os registros ainda referenciados no ndice

ndices

Em um arquivo indexado, podem existir tantos ndices quantas forem as chaves de acesso aos registros Um ndice consiste de uma entrada para cada registro considerado relevante com relao chave de acesso associada ao ndice As entradas do ndice so ordenadas pelo valor da chave de acesso, sendo cada uma constituda por um par (chave do registro, endereo do registro) A sequencia fsica das entradas no ndice visa tornar mais eficiente o processo de busca e permitir o acesso serial ao arquivo

Tipos de ndice

ndices exaustivos

ndices seletivos
ndices indiretos

ndice Exaustivo

Possui uma entrada para cada registro do arquivo de dados

ndice Seletivo

Possui entradas apenas para um subconjunto dos registros O subconjunto definido por uma condio relativa chave de acesso e/ou a outros atributos do arquivo Exemplo
ndice

dos funcionrios que trabalham h mais de 10 anos em uma empresa

ndice Indireto

Possui entradas que apontam para outro arquivo de ndice No segundo ndice, h a referncia aos registros de dados A figura a seguir mostra um primeiro ndice seletivo indireto, um ndice exaustivo e o arquivo de dados

ndice Indireto

Arquivos Indexados - Problemas

Necessidade de atualizao de todos os ndices quando um registro inserido no arquivo Atualizao dos ndices tambm necessria quando a alterao de um registro envolve um atributo associado a algum ndice

Arquivos Indexados - Operaes


Pesquisa/busca Excluso Insero Alterao Leitura exaustiva Reorganizao de um arquivo Reconstruo do ndice

Arquivos Indexados - Pesquisa

Busca pelo ndice correspondente chave de acesso usada para localizao da entrada correspondente ao argumento de pesquisa e obteno do registro de dados A busca no arquivo de ndice pode ser sequencial ou binria

Arquivos Indexados - Pesquisa


static void PesquisaIdxMat() { BinaryReader idxMat = new BinaryReader(new FileStream("FuncMat.idx", FileMode.Open, FileAccess.Read)); short MatrPesq, Matr; long Pos; bool achou = false; Funcionario Func = new Funcionario(); Console.Write("Matrcula : "); MatrPesq = short.Parse(Console.ReadLine()); while (!achou && idxMat.PeekChar() >= 0) { Matr = idxMat.ReadInt16(); Pos = idxMat.ReadInt64(); if (MatrPesq == Matr) { streamArq.Seek(Pos, SeekOrigin.Begin); Func.Ler(inFunc); // Processamento achou = true; } } if (!achou) Console.WriteLine("\nFuncionrio no localizado.\n"); }

Arquivos Indexados - Pesquisa


static void PesquisaIdxMat() { BinaryReader idxMat = new BinaryReader(new FileStream("FuncMat.idx", FileMode.Open, FileAccess.Read)); short MatrPesq, Matr; long Pos; bool achou = false; Funcionario Func = new Funcionario(); Console.Write("Matrcula : "); MatrPesq = short.Parse(Console.ReadLine()); while (!achou && idxMat.PeekChar() >= 0) { Matr = idxMat.ReadInt16(); Pos = idxMat.ReadInt64(); if (MatrPesq == Matr) { streamArq.Seek(Pos, SeekOrigin.Begin); Func.Ler(inFunc); // Processamento achou = true; } } if (!achou) Console.WriteLine("\nFuncionrio no localizado.\n"); }

Arquivos Indexados - Pesquisa


static void PesquisaIdxMat() { BinaryReader idxMat = new BinaryReader(new FileStream("FuncMat.idx", FileMode.Open, FileAccess.Read)); short MatrPesq, Matr; long Pos; bool achou = false; Funcionario Func = new Funcionario(); Console.Write("Matrcula : "); MatrPesq = short.Parse(Console.ReadLine()); while (!achou && idxMat.PeekChar() >= 0) { Matr = idxMat.ReadInt16(); Pos = idxMat.ReadInt64(); if (MatrPesq == Matr) { streamArq.Seek(Pos, SeekOrigin.Begin); Func.Ler(inFunc); // Processamento achou = true; } } if (!achou) Console.WriteLine("\nFuncionrio no localizado.\n"); }

Arquivos Indexados - Pesquisa


static void PesquisaIdxMat() { BinaryReader idxMat = new BinaryReader(new FileStream("FuncMat.idx", FileMode.Open, FileAccess.Read)); short MatrPesq, Matr; long Pos; bool achou = false; Funcionario Func = new Funcionario(); Console.Write("Matrcula : "); MatrPesq = short.Parse(Console.ReadLine()); while (!achou && idxMat.PeekChar() >= 0) { Matr = idxMat.ReadInt16(); Pos = idxMat.ReadInt64(); if (MatrPesq == Matr) { streamArq.Seek(Pos, SeekOrigin.Begin); Func.Ler(inFunc); // Processamento achou = true; } } if (!achou) Console.WriteLine("\nFuncionrio no localizado.\n"); }

Arquivos Indexados - Pesquisa


static void PesquisaIdxMat() { BinaryReader idxMat = new BinaryReader(new FileStream("FuncMat.idx", FileMode.Open, FileAccess.Read)); short MatrPesq, Matr; long Pos; bool achou = false; Funcionario Func = new Funcionario(); Console.Write("Matrcula : "); MatrPesq = short.Parse(Console.ReadLine()); while (!achou && idxMat.PeekChar() >= 0) { Matr = idxMat.ReadInt16(); Pos = idxMat.ReadInt64(); if (MatrPesq == Matr) { streamArq.Seek(Pos, SeekOrigin.Begin); Func.Ler(inFunc); // Processamento achou = true; } } if (!achou) Console.WriteLine("\nFuncionrio no localizado.\n"); }

Arquivos Indexados - Pesquisa


static void PesquisaIdxMat() { BinaryReader idxMat = new BinaryReader(new FileStream("FuncMat.idx", FileMode.Open, FileAccess.Read)); short MatrPesq, Matr; long Pos; bool achou = false; Funcionario Func = new Funcionario(); Console.Write("Matrcula : "); MatrPesq = short.Parse(Console.ReadLine()); while (!achou && idxMat.PeekChar() >= 0) { Matr = idxMat.ReadInt16(); Pos = idxMat.ReadInt64(); if (MatrPesq == Matr) { streamArq.Seek(Pos, SeekOrigin.Begin); Func.Ler(inFunc); // Processamento achou = true; } } if (!achou) Console.WriteLine("\nFuncionrio no localizado.\n"); }

Arquivos Indexados - Pesquisa


static void PesquisaIdxMat() { BinaryReader idxMat = new BinaryReader(new FileStream("FuncMat.idx", FileMode.Open, FileAccess.Read)); short MatrPesq, Matr; long Pos; bool achou = false; Funcionario Func = new Funcionario(); Console.Write("Matrcula : "); MatrPesq = short.Parse(Console.ReadLine()); while (!achou && idxMat.PeekChar() >= 0) { Matr = idxMat.ReadInt16(); Pos = idxMat.ReadInt64(); if (MatrPesq == Matr) { streamArq.Seek(Pos, SeekOrigin.Begin); Func.Ler(inFunc); // Processamento achou = true; } } if (!achou) Console.WriteLine("\nFuncionrio no localizado.\n"); }

Arquivos Indexados - Pesquisa


static void PesquisaIdxMat() { BinaryReader idxMat = new BinaryReader(new FileStream("FuncMat.idx", FileMode.Open, FileAccess.Read)); short MatrPesq, Matr; long Pos; bool achou = false; Funcionario Func = new Funcionario(); Console.Write("Matrcula : "); MatrPesq = short.Parse(Console.ReadLine()); while (!achou && idxMat.PeekChar() >= 0) { Matr = idxMat.ReadInt16(); Pos = idxMat.ReadInt64(); if (MatrPesq == Matr) { streamArq.Seek(Pos, SeekOrigin.Begin); Func.Ler(inFunc); // Processamento achou = true; } } if (!achou) Console.WriteLine("\nFuncionrio no localizado.\n"); }

Arquivos Indexados Pesq. Binria


static void PesquisaBinIdxMat() // A pesquisa binria s possvel quando os registros (seja no arquivo de dados ou // ndice) tem tamanho fixo { BinaryReader idxMat = new BinaryReader(new FileStream("FuncMat.idx", FileMode.Open, FileAccess.Read)); short MatrPesq, // Matrcula a ser pesquisada Matr; // Matrcula lida do arquivo de ndice long Pos, //Posio do registro no arquivo de dados inicio = 0, // posio (RRN) do primeiro registro do intervalo a ser pesquisado fim, // posio (RRN) do ltimo registro do intervalo a ser pesquisado meio, // posio (RRN) do registro central do intervalo a ser pesquisado tamRegistro; // Tamanho dos registros no arquivo de ndice tamRegistro = sizeof(short)+sizeof(long); fim = (idxMat.BaseStream.Length)/tamRegistro-1; meio = (inicio + fim) / 2; bool achou = false; Funcionario Func = new Funcionario(); Console.Write("Matrcula : "); MatrPesq = short.Parse(Console.ReadLine()); Continuao no prximo slide...

Arquivos Indexados Pesq. Binria


... continuao while (fim >= inicio && !achou) { idxMat.BaseStream.Seek(meio * tamRegistro, SeekOrigin.Begin); Matr = idxMat.ReadInt16(); Pos = idxMat.ReadInt64(); Console.WriteLine("Matrcula atual: " + Matr); if (MatrPesq == Matr) { streamArq.Seek(Pos, SeekOrigin.Begin); Func.Ler(inFunc); // Processamento achou = true; } else { if (MatrPesq < Matr) fim = meio - 1; else inicio = meio + 1; meio = (inicio + fim) / 2; } } if (!achou) Console.WriteLine("\nFuncionrio no localizado.\n"); }

Arquivos Indexados - Excluso

Opes
Excluso

lgica no arquivo de dados

Problema:

acesso pelo arquivo de ndice sem verificar a excluso lgica

Excluso As

fsica no arquivo de ndice


acesso pelo arquivo de dados

Problema:

2 opes em conjunto (ideal)

Deve-se

excluir logicamente o registro do arquivo de dados e depois reconstruir o ndice

Arquivos Indexados - Insero

O registro armazenado em qualquer endereo vago


Na

rea de um registro excludo


apenas com registros de tamanho fixo

Funciona

No

final do arquivo

Pode-se manter um ndice seletivo para endereos vazios necessrio verificar se a chave escolhida j no est cadastrada no arquivo
Dois

registros no podem ter a mesma chave

Arquivos Indexados - Alterao


Feita aps a verificao da existncia do registro necessrio, portanto, realizar uma operao de busca Quando o registro localizado, seus campos so alterados Se uma chave de acesso for alterada, os arquivos de ndice devem ser alterados Caso a alterao seja na chave de identificao, necessrio verificar primeiro se j no existe um registro com a nova chave

Arquivos Indexados Leitura exaustiva


Leitura sequencial de todos os registros A ordem seguida a ordem dos registros no arquivo de ndice

static void ListaIdxMat() { BinaryReader idxMat = new BinaryReader(new FileStream("FuncMat.idx", FileMode.Open, FileAccess.Read)); Funcionario Func = new Funcionario(); short Matr; long Pos = 0; while (idxMat.PeekChar() >= 0) { Matr = idxMat.ReadInt16(); Pos = idxMat.ReadInt64(); streamArq.Seek(Pos, SeekOrigin.Begin); Func.Ler(inFunc); // Processamento } idxMat.Close(); }

Arquivos Indexados Reorganizao do arquivo de dados

Deve ser executada periodicamente


O

prazo depende da sua aplicao

Principais objetivos
Colocar
Isso

o arquivo ordenado sequencialmente pela chave de maior acesso


reduz o nmero de acessos a disco

Remover

os espaos dos registros excludos logicamente

Arquivos Indexados Reorganizao do arquivo de dados

SO l os registros em blocos e os armazena na memria interna


Se

o arquivo j estiver ordenado, o desempenho do sistema pode ser melhorado

A remoo dos registros excludos necessria para reduzir o tamanho do arquivo


Acelera

o processo de busca dos registros

Arquivos Indexados Reconstruo do ndice

Nem sempre a reconstruo pode ser feita na memria interna (o arquivo de ndice to grande que no cabe na memria) A ordenao do ndice pode ser feita utilizando qualquer algoritmo de ordenao Sugere-se, entretanto, a utilizao de algoritmos mais eficiente como o QuickSort

Arquivos Indexados Reconstruo do ndice


static void GerarIndiceMat() { SortedDictionary<short, long> dicMatricula = new SortedDictionary<short, long>(); BinaryWriter idxMat = new BinaryWriter(new FileStream("FuncMat.idx", FileMode.Create, FileAccess.Write)); streamArq.Seek(0, SeekOrigin.Begin); Funcionario Func = new Funcionario(); long ultimaPos = 0; while (inFunc.PeekChar() >= 0) { ultimaPos = streamArq.Position; Func.Ler(inFunc); if (Func.Status != '*') dicMatricula.Add(Func.Matricula, ultimaPos); } foreach (KeyValuePair<short, long> kvp in dicMatricula) { idxMat.Write(kvp.Key); idxMat.Write(kvp.Value); } idxMat.Close(); }

You might also like