Buscar

Organização de Arquivos - Organizando Arquivos para Desempenho (Parte 3)

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 27 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 27 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 27 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Introduc¸a˜o a` Organizac¸a˜o de Arquivos: Aula 11
Departamento de Cieˆncia da Computac¸a˜o
Instituto de Cieˆncias Exatas
Universidade de Bras´ılia
1 / 27
Suma´rio
Organizand Arquivos para Desempenho
1 Conceitos em Teoria da Informac¸a˜o
2 Compressa˜o de dados
3 Recuperando espac¸o em disco
4 Uma introduc¸a˜o a ordenac¸a˜o interna e busca bina´ria
5 Ordenac¸a˜o de chaves (Keysorting ou Tag Sort)
6 Ordenac¸a˜o de arquivos grandes
2 / 27
Encontrando as Coisas Mais Rapidamente
Relembrando
No in´ıcio falamos do custo de acesso a` memo´ria secunda´ria × custo de acesso a
memo´ria RAM.
No entanto, ate´ agora na˜o prestamos muita atenc¸a˜o neste custo!
3 / 27
Encontrando as Coisas Mais rapidamente
Vamos Mudar o Foco!
Organização
Fundamental
Busca de um pedaço 
específico de informação 
num determinado 
arquivo.
O custo de seek passa
a ser um fator determinante!
De:
Para:
4 / 27
Encontrando as Coisas Mais Rapidamente
Sorting and Searching
Um algoritmo de ordenac¸a˜o normalmente envolve fazer muitas comparac¸o˜es.
Cada uma dessas comparac¸o˜es, no caso de memo´ria secundaria, envolve um seek.
Sorting and searching: Desenvolveremos abordagens para minimizar o nu´mero de
acessos a disco e portanto, minimizar o tempo gasto. Dados ordenados permitem
uma busca mais ra´pida. Objetivo: Minimizar o nu´mero de seeks
5 / 27
Busca por PRR e Chave
Problema
Ate´ o momento vimos que a recuperac¸a˜o de dados mais ra´pida e´ o acesso direto,
que e´ poss´ıvel via a PRR.
A PRR apenas indica o byte inicial de um registro mas na˜o da´ nenhuma informac¸a˜o
sobre o conteu´do do registro.
E se no´s na˜o conhecemos a PRR do registro que estamos buscando?
Soluc¸a˜o
Busca atrave´s de uma chave!
6 / 27
Busca por PRR e Chave
Busca por Chave
E se nenhum registro conte´m a chave buscada? No pior caso, temos que olhar
cada registro no arquivo.
E se existir mais de um registro contendo a chave buscada, e no´s queremos
encontrar todos eles? No pior caso, temos que olhar cada registro no arquivo
Isto sugere que para buscar por chave precisamos fazer busca sequencial.
E se os Dados Estiverem Ordenados?
Busca Bina´ria!
7 / 27
Relembrando a Busca Bina´ria
Observac¸a˜o
Note que em ambos os casos a pesquisa sequeˆncial levaria a muito mais comparac¸o˜es, no
primeiro caso 13 comparac¸o˜es ate´ se chegar no 24, e no segundo 5 ate´ se chegar no 8.
8 / 27
Busca Bina´ria
Algoritmo 1 Busca Bina´ria
Input: arq, n, chaveB
Output: Ocorreˆncia de chaveB no Arquivo, caso exista
1: inicio← 0
2: fim← 0
3: while inicio ≤ fim do
4: meio← ⌊ inicio+fim
2
⌋
5: Posiciona(arq,meio)
6: Leia(arq,meio)
7: if chaveB < reg.chave then
8: fim← meio− 1
9: else if chaveB > reg.chave then
10: inicio← meio+ 1
11: else
12: return meio
13: end if
14: end while
15: return NotFound
9 / 27
Busca Bina´ria
Complexidade da Busca Bina´ria
A cada paso do lac¸o da busca bina´ria a quantidade de dados reduz pela metade.
Pergunta: Dado um nu´mero n de dados, quantas comparac¸o˜es no ma´ximo preciso
para achar um determinado valor utilizando a busca bina´ria?
Dado um inteiro n, quantas vezes preciso dividir ele pela metade ate´ chegar ou ficar
abaixo de 1.
Ou seja n
2k
≤ 1, o que significa que k > log2 n.
Logo, no pior caso, ma busca bina´ria sera˜o feitas:
blog2 nc+ 1 = O(log2 n)
comparac¸o˜es.
10 / 27
Busca Bina´ria
Busca Bina´ria Vs Busca Sequencial
O arquivo deve estar ordenado para executarmos a busca bina´ria.
Complexidade:
Suponha um Arquivo de n registros.
Busca Bina´ria = O(log2 n)
Busca Sequencial = O(n)
Isto e´, se o arquivo dobra de tamanho:
a busca sequencial dobra!
a busca bina´ria aumenta de um (assumindo que o arquivo esteja ordenado)!
se n = 1000, blog2 1000c = 9.
se n = 2000, blog2 1000c = 10.
11 / 27
Problemas da Busca Bina´ria
Problema 1
Os acessos ao arquivo ocorrem em registros diferentes do arquivo.
Requer movimentac¸a˜o constante do cabec¸ote (seek).
Em um arquivo com 100.000 registros tem no ma´ximo 17 acessos.
Com o PRR se faz um u´nico acesso.
Poss´ıvel Soluc¸a˜o
conjugar o acesso por chave e PRR: isto pode ser feito usando um arquivo de ı´ndice
(´ındice e´ um ponteiro para um registro, e portanto diferente de chave).
12 / 27
Problemas da Busca Bina´ria
Problema 2
Manter um arquivo ordenado e´ caro.
A cada adic¸a˜o de registro:
Deve-se pesquisar a sua posic¸a˜o e depois deslocar todos os registros posteriores de
uma posic¸a˜o.
Se as adic¸o˜es sa˜o pouco frequ¨entes, enta˜o pode-se fazer atualizac¸o˜es em lote.
Poss´ıveis Soluc¸o˜es
Na˜o reordenar todo o arquivo quando novos registros forem inclu´ıdos (utilizando
ı´ndices).
Usar estruturas de dados que permitam reordenac¸a˜o mais ra´pida e eficiente do
arquivo (uso de estruturas como a´rvore-B).
13 / 27
Problemas da Busca Bina´ria
Problema 3
Sort em memo´ria (“Internal Sorting”) so´ e´ via´vel para arquivos pequenos.
Se o arquivo for grande e´ melhor usar um sort externo (i.e. em disco).
Poss´ıvel Soluc¸a˜o
Usar outras te´cnicas de ordenac¸a˜o (Keysorting!).
Keysorting
Keysorting (ou Tag Sort) e´ uma variac¸a˜o do “Internal Sorting”.
O tamanho do arquivo que o Keysorting pode ordenar e´ limitado, mas seu limite e´
maior que o “Internal Sorting”.
14 / 27
Busca Bina´ria: Resumo
Vantagens
Muito mais ra´pida que a busca sequencial!
Desvantagens
O arquivo deve estar ordenado pela chave.
Incluir dados em arquivo, mantendo a ordenac¸a˜o da chave e´ caro.
15 / 27
Keysorting
Keysorting
Utiliza-se para ordenar um arquivo que e´ muito grande para caber na memo´ria RAM.
Para ordenar um arquivo, precisamos apenas das chaves!!!
Me´todo:
1 Abra o arquivo leia e coloque num vetor de tags somente a chave e a PRR de cada
registro (se o registro tem tamanho fixo enta˜o podemos utilizar NRR em lugar da
PRR).
2 Na˜o e´ necessario manter em memo´ria todos os registros inteiros.
3 Ordene o vetor em memo´ria (“Internal Sorting”).
4 Reescrever os arquivo segundo a ordem dada pelo vetor ordenado.
16 / 27
Keysorting
1
2
Main Memory
Internal Sorting
in main memory
keynodes array
keynodes array
records
Disk
records
No change in Disk
17 / 27
Keysorting
3
Internal Sorting
in main memory
keynodes array
records
Create new sorted file
to replace previous
18 / 27
Keysorting
Problemas
Ler registros na ordem do vetor implica tempo alto
Sa˜o lidas porc¸o˜es dispersas em disco, gerando tempos elevados de seek, lateˆncia e
transfereˆncia.
Soluc¸a˜o
Usar o vetor de chaves para criar um arquivo de ı´ndices e NA˜O mover os registros.
index file records
Leave file unchanged
19 / 27
Keysorting
Keysorting
Ao inve´s de regravar o arquivo, conforme mapeado pelo vetor de tags, grave apenas
o vetor de tags!
Use esse arquivo como um arquivo ı´ndice.
Use pesquisa bina´ria nele, talvez na memo´ria.
use PRR associado a chave encontrada para acesso.
O arquivo passa a ser acess´ıvel pela chave com um u´nico acesso, via PRR.
Inclusa˜o de registros no arquivo ba´sico.
Reuse o espac¸o de registros eliminados logicamente.
Inclua o registro no final do arquivo.
Observac¸a˜o
Se algumas partes do processo comec¸am a se tornar um gargalo (bottleneck), considere
“pular” tudo. Pense: “posso fazer sem isso”?
20 / 27
Ordenac¸a˜o: Registros Eliminados
Ordenac¸a˜o: Registros Eliminados
Registros com:
Campo para indicar status de va´lido ou eliminado.
Ponteiro para outros registros eliminados.
Ordenar arquivos com registros eliminados e´ problema´tico ou mesmo imposs´ıvel:
Registro eliminado na˜o pode ser mudado de lugar.
Ele e´ apontado por outro registrodeste arquivo ou de outros arquivos (´ındices).
A ide´ia e´ manter o arquivo com atualizac¸o˜es fazendo reuso dos registros eliminados:
O acesso por chave pode ser feito via arquivo ı´ndice.
Tais arquivos ı´ndices devem ser atualizados a cada inclusa˜o de novos registros no
arquivo ba´sico.
Discutiremos isso no Cap´ıtulo 6!
21 / 27
Pro´xima Aula
Pro´xima Aula
Indexac¸a˜o.
22 / 27
Co´digos
Co´digos
Os co´digos foram retirados de File Structures: An Object-Oriented Approach with C ++, 3rd Edition e
apresentam a descric¸a˜o das principais classes.
Para a versa˜o escrita em C, consulte File Structures, 2nd Edition.
buscaBinaria.cpp: Descreve o algoritmo gene´rico de busca bina´ria.
keyType.cpp: Descric¸a˜o da classe, me´todos e operadores que devem ser implementados para suportar
uma busca bina´ria gene´rica]
fixedRecordFile.cpp: Descric¸a˜o da classe que trabalha com registros fixos e os me´todos necessa´rios para
implementar o algoritmo keysort de maneira adequada.
keysort.cpp: Algoritmo Keysort.
23 / 27
Co´digos
1 //A b i n a r y s e a r c h a l g o r i t hm
2
3 i n t B i n a r y S e a r c h ( F i x e d R e c o r d F i l e & f i l e , RecType & obj , KeyType & key
4 // b i n a r y s e a r c h f o r key
5 // i f key found , ob j c o n t a i n s c o r r e s p ond i n g reco rd , 1 r e t u r n e d
6 // i f key not found , 0 r e t u r n e d
7 {
8 i n t low =0; i n t h i g h = f i l e . NumRecs ()−1;
9 w h i l e ( low<=h i g h ){
10 i n t g u e s s = ( h i g h − low ) / 2 ;
11 f i l e . ReadByRRN ( obj , g u e s s ) ;
12 i f ( o b j . Key()==key ) r e t u r n 1 ; // r e c o r d found
13 i f ( o b j . Key ( ) < key ) h i g h = g u e s s −1; // s e a r c h b e f o r e gue s s
14 e l s e low = g u e s s +1; // s e a r c h a f t e r gue s s
15 }
16 r e t u r n 0 ; // loop ended w i thout f i n d i n g key
17 }
Co´digo 1: buscaBinaria.cpp
24 / 27
Co´digos
1 // C l a s s e s and methods tha t must be implemented to suppo r t the
2 // b i n a r y s e a r c h a l g o r i t hm
3
4 c l a s s KeyType
5 {
6 p u b l i c :
7 i n t o p e r a t o r == ( KeyType &); // e q u a l i t y o p e r a t o r
8 i n t o p e r a t o r < ( KeyType &); // l e s s than op e r a t o r
9 } ;
10
11 c l a s s RecType{ p u b l i c : KeyType Key ( ) ; } ;
12
13 c l a s s F i x e d R e c o r d F i l e
14 {
15 p u b l i c :
16 i n t NumRecs ( ) ;
17 i n t ReadByRRN ( RecType & r e c o r d , i n t RRN ) ;
18 } ;
Co´digo 2: keyType.cpp
25 / 27
Co´digos
1 //min imal f u n c t i o n a l i t y r e q u i r e d f o r c l a s s e s used by the k e y s o r t a l g o r i t hm
2
3 c l a s s F i x e d R e c o r d F i l e
4 {
5 p u b l i c :
6 i n t NumRecs ( ) ;
7 i n t ReadByRRN ( RecType & r e c o r d , i n t RRN ) ;
8 // a d d i t i o n a l methods r e q u i r e d f o r k e y s o r t
9 i n t C r e a t e ( char∗ f i l e N a m e ) ;
10 i n t Append ( RecType & r e c o r d ) ;
11 } ;
12
13 c l a s s KeyRRN
14 // c o n t a i n s a p a i r (KEY, RRN)
15 {
16 p u b l i c :
17 KeyType KEY ; i n t RRN;
18 KeyRRN ( ) ;
19 KeyRRN ( KeyType key , i n t r r n ) ;
20 } ;
21
22 i n t S o r t (KeyRRN [ ] , i n t numKeys ) . // s o r t a r r a y by key
Co´digo 3: fixedRecordFile.cpp
26 / 27
Co´digos
1 // A lgo r i thm f o r Keyso r t
2
3 i n t K e y S i r t ( F i x e d R e c o r d F i l e & i n F i l e , char∗ outFi leName )
4 {
5 RecType o b j ;
6 KeyRRN∗ KEYNODES = new KeyRRN [ i n F i l e . NumRecs ( ) ] ;
7 // read f i l e and l oad Keys
8 f o r ( i n t i =0; i< i n F i l e . NumRecs ( ) ; i ++){
9 i n F i l e . ReadByRRN ( obj , i ) ; // read r e c o r d u
10 KEYNODES[ i ] = KeyRRN( o b j . key ( ) , i ) ; // put key and RRN i n t o Keys
11 }
12 S o r t (KEYNODES, i n F i l e . NumRecs ( ) ) ; // s o r t Keys
13 F i x e d R e c o r d F i l e o u t F i l e ; // f i l e to ho ld r e c o r d s i n key o r d e r
14 o u t F i l e . C r e a t e ( outFi leName ) ; // c r e a t e a new f i l e
15 // w r i t e a new f i l e i n key o r d e r
16 f o r ( i n t j =0; j< i n F i l e . NumRecs ( ) ; j ++){
17 i n F i l e . ReadByRRN ( obj ,KEYNODES[ j ] . RRN ) ; // read i n key o r d e r
18 o u t f i l e . Append ( o b j ) ; // w r i t e i n key o r d e r
19 }
20 r e t u r n 1 ;
21 }
Co´digo 4: keysort.cpp
27 / 27

Outros materiais