Acesso Sequencial Indexado
Objetivo: Considerar de forma unificada as seguintes visões
sobre estruturas de acesso a arquivos:
• Visão indexada: o arquivo é visto como um conjunto de
registros indexados por chaves.
• Visão sequencial: o arquivo pode ser acessado sequencialmente,
gerando registros ordenados por chaves.
Exemplo:
Operações cosequenciais
+
operações indexadas
ler um arquivo “inteiro” (menos seek) ler cada chave para acessar os registros
para, por exemplo, ordená-lo
Acesso Sequencial Indexado
Conjuntos de sequência de registros
Objetivo: manter dinamicamente um conjunto de registros ordenados
por chaves no disco
Problema: ordenação do arquivo em disco é “cara”!
Solução:
• organizar os registros em blocos  operações locais
• um bloco se torna a menor unidade endereçável nas operações
de leitura e escrita no disco (é carregado todo na RAM).
Exemplo:
Chaves = nomes
4 nomes/bloco (fator de bloco)
Chaves:
Adams
Baird
Bixby
Boone
Bynum
Carson
Cole
Davis
Denver
Ellis
bloco 1
Adams
bloco 2
Baird Bixby
Boone
Bynum Carson Cole Davis
bloco 3
Denver
Ellis
Introduzir Carter :
bloco 1
bloco 2
bloco 3
bloco 4
Adams
Baird Bixby Boone
Bynum Carson Carter
Denver
Cole
Ellis
Davis
subdivisão (split)
de bloco
Eliminar Davis :
bloco 1
bloco 2
bloco 3
bloco 4
Adams
Baird Bixby
Boone
Bynum Carson Carter
Denver
Cole
Ellis
underflow
Eliminar Davis :
bloco 1
bloco 2
Adams
Baird Bixby
Bynum Carson Carter
bloco 3
bloco 4
Boone
disponível
Cole
Denver
Ellis
concatenação
Conclusão: o arquivo inteiro pode ser mantido ordenado apenas
pela ordenação de suas partes (blocos).
Problemas:
• A ordenação do arquivo pode exigir mais espaço em disco por
conta de fragmentações internas. Neste caso, pode-se adotar
estratégias que privilegiem a redistribuição de chaves.
• A ordem física dos registros só é garantida ao longo de
um bloco e não entre-blocos.
Qual deve ser o tamanho de um bloco?
-Deve representar um compromisso entre tempo de acesso, memória RAM
(buffer) disponível e as operações a serem executadas.
• O tamanho do bloco deve permitir o armazenamento de vários destes na
memória.
• O tempo de leitura e escrita de um bloco não deve ser muito longo (para não
perder o que se ganhou economizando-se em seeks).
Sequência de registros e indexação
Objetivo: definir um método eficiente que possibilite o acesso a
um bloco contendo uma chave (ou registro) procurada.
Ideia: construir um índice de chaves (a partir do último registro de
cada bloco, por exemplo), apontando para cada um destes blocos.
Sequência de blocos:
Adams-Berne Bolen-Cage Camp-Dutton Embry-Evans Faber-Folk
1
2
3
4
5
Folks-Gaddis
6
Adams-Berne Bolen-Cage Camp-Dutton Embry-Evans Faber-Folk
1
2
Chave
Berne
Cage
Dutton
Evans
Folk
Gaddis
3
4
Número do Bloco
1
2
3
4
5
6
Índices da sequência de blocos
5
Folks-Gaddis
6
Chaves delimitadoras
• Os índices servem apenas de guia na busca do bloco que contém a chave a
ser acessada  delimitadores
• Menor delimitador possível (não-único)  economia de espaço (neste caso,
teremos uma árvore B+ de prefixo simples)
Delimitadores de blocos
CAM
BO
F
E
FOLKS
Adams-Berne Bolen-Cage Camp-Dutton Embry-Evans Faber-Folk
1
2
3
4
5
Folks-Gaddis
6
Arquivo sequencial indexado e árvore B+ de prefixo simples
E
conjunto de
índices
BO
F
CAM
FOLKS
Adams-Berne Bolen-Cage Camp-Dutton Embry-Evans Faber-Folk
1
2
3
4
5
Folks-Gaddis
6
A busca
• A partir dos índices na árvore B, podemos acessar um bloco da seguinte
forma:
1.
Se chave procurada < delimitador, então vá para a esquerda na árvore
2.
se chave >= delimitador, então vá para a direita na árvore
Lembrando: Árvore B+ de prefixo simples  os delimitadores são os
menores possíveis na árvore B
Operações sobre árvores B+
• Supressão de registros sem originar concatenação e redistribuição  alterações
apenas nos blocos de registros; o conjunto de índices não é alterado
• Inserção sem subdivisão  idem
E
conjunto de
índices
BO
CAM
F
FOLKS
Adams-Berne Bolen-Cage Camp-Dutton Embry-Evans Faber-Folk
1
2
3
4
5
Folks-Gaddis
6
Apagar Embry e Folks
E
BO
F
CAM
FOLKS
Adams-Berne Bolen-Cage Camp-Dutton Embry-Evans Faber-Folk
1
2
3
4
5
Folks-Gaddis
6
E
BO
Adams-Berne
1
F
CAM
Bolen-Cage Camp-Dutton
2
3
FOLKS
Ervin-Evans
Faber-Folk
4
5
Frost-Gaddis
6
• Inserção causando subdivisão  mudanças no número de blocos
de registros
 alteração no conjunto de índices através das regras aplicadas às
árvores B.
• Supressão com redistribuição e/ou concatenação  idem
Inserir Ayers
E
BO
Adams-Berne
CAM
F
Bolen-Cage Camp-Dutton
1
Ervin-Evans
Faber-Folk
4
5
3
2
FOLKS
Frost-Gaddis
6
Ayers (causa subdivisão do bloco 1 com criação do bloco 7)
BO
CAM
AY
Adams-Avery
1
Ayers-Berne
7
E
F
Bolen-Cage Camp-Dutton
2
3
FOLKS
Ervin-Evans
Faber-Folk
4
5
Frost-Gaddis
6
• Supressão com underflow  concatenação dos blocos de registros
BO
CAM
AY
Adams-Avery
1
Ayers-Berne
7
E
F
Bolen-Cage Camp-Dutton
2
3
FOLKS
Ervin-Evans
Faber-Folk
4
5
Frost-Gaddis
6
remoções no bloco 2 causam underflow e subsequente
concatenação com o bloco 3, o qual pode ser colocado numa
avail list
BO
CAM
AY
Adams-Avery
E
F
Ayers-Berne Bolen-Cage Camp-Dutton
7
1
2
FOLKS
Ervin-Evans
Faber-Folk
4
5
3
Frost-Gaddis
6
concatenação
E
AY
Adams-Avery
1
BO
F
Ayers-Berne Bolen-Dutton
7
2
FOLKS
Ervin-Evans
Faber-Folk
Frost-Gaddis
4
5
6
Assim:
• Se blocos de registros são subdivididos  um novo delimitador é necessário
no conjunto de índices
• Se blocos são concatenados  um separador deve ser removido do conjunto
de índices
• Se registros são redistribuídos entre blocos da sequência de registros  o
delimitador no conjunto de índices deve ser atualizado
Blocos de Conjunto de Índices (delimitadores)
• Os índices podem ser armazenados em blocos, tal como os registros
(de mesmo tamanho dos blocos dos registros)
• Os delimitadores podem ser de tamanho variável  grande número de
delimitadores em um bloco de índice  árvore menos profunda. Uma
busca binária pode ser feita sobre estes delimitadores armazenados em
RAM
Exemplo de estrutura de um bloco de índice
AsBsBroCChCraDeleEdlErrFaFle
delimitadores concatenados
00 02 04 07 08 10 13 17 20 23 25
NRR dos delimitadores
Número de delimitadores
Tamanho total dos delimitadores
11
28
AsBsBroCChCraDeleEdlErrFaFle 00 02 04 07 08 10 13 17 20 23 25 B00 B01 B02 B03 B04 B05 B06 B07 B08 B09 B10 B11
delimitadores
NRR dos delimitadores
Número relativo dos blocos
Número de delimitadores
Tamanho total dos delimitadores
11
28
AsBsBroCChCraDeleEdlErrFaFle 00 02 04 07 08 10 13 17 20 23 25 B00 B01 B02 B03 B04 B05 B06 B07 B08 B09 B10 B11
delimitadores
NRR dos delimitadores
Número relativo dos blocos
Nível conceitual:
ordem dos delimitadores
0
1
2
3
4
5
6
7
8
9
10
B00 As B01 Bs B02 Bro B03 C B04 Ch B05 Cra B06 Dele B07 Edi B08 Err B09 Fa B10 Fle
B11
Criação sequencial da árvore B+
Problema: A criação aleatória da árvore ( com registros introduzidos
não-ordenadamente à medida que chegam) envolve operações
de subdivisão e redistribuição que são “caras”.
Ideia: Ordenar o conjunto dos registros que comporão a árvore, armazenando-os
sucessivamente nos blocos
 os registros são armazenados na ordem correta. Para cada bloco é definido o
seu delimitador que, em seguida, é armazenado no bloco de índices (contido na
memória até que o bloco esteja cheio)
Exemplo:
ALWASPBET 00 03 06
Access-Also
Always-Ask
Aspect-Best
Better-Cast
Catch-Check
Novo bloco
CAT
-1 -1
ALWASPBET 00 03 06
Access-Also
Always-Ask
bloco sem
delimitadores!
00 -1 -1
Aspect-Best
Better-Cast
-1
Catch-Check
Class-Copy
Novo bloco
00
CAT
ALWASPBET 00 03 06
CL
-1 -1
00 -1 -1
Access-Also Always-Ask Aspect-Best Better-Cast
Catch-Check Class-copy
Cost-Damage
Novo bloco
00
CAT
ALWASPBET 00 03 06
CL COS
-1 -1
00 02 -1
Access-Also Always-Ask Aspect-Best Better-Cast
Catch-Check Class-copy Cost-Damage
Delete-Dise
Novo bloco
CAT
ALWASPBET 00 03 06
00
CL COS DE
-1 -1
00 02 05
Access-Also Always-Ask Aspect-Best Better-Cast
Catch-Check Class-copy Cost-Damage Delete-Dise
Drum-Editor
Novo bloco
CAT DR
ALWASPBET 00 03 06
00
CL COS DE
03 -1
00 02 05
Access-Also Always-Ask Aspect-Best Better-Cast
Catch-Check Class-copy Cost-Damage Delete-Dise
Drum-Editor
-1 -1 -1
Effort-Crow
Novo bloco
CAT DR
ALWASPBET 00 03 06
00
CL COS DE
03 -1
00 02 05
EF
Access-Also Always-Ask Aspect-Best Better-Cast
Catch-Check Class-copy Cost-Damage Delete-Dise
Drum-Editor Effort-Crow
00 -1 -1
Head-Ideal
Novo bloco
CAT DR
ALWASPBET 00 03 06
00
CL COS DE
03 -1
00 02 05
EFH
00 02 -1
Access-Also Always-Ask Aspect-Best Better-Cast
Catch-Check Class-copy Cost-Damage Delete-Dise
Drum-Editor Effort-Crow Head-Ideal
Ignore-Item
Novo bloco
CAT DR
ALWASPBET 00 03 06
00
CL COS DE
03 -1
00 02 05
EFHIG
00 02 03
Access-Also Always-Ask Aspect-Best Better-Cast
Catch-Check Class-copy Cost-Damage Delete-Dise
Drum-Editor Effort-Crow Head-Ideal
Ignore-Item
Separadores Completos
ALWAYSASPECTBETTER
Access-Also
Always-Ask
00 06 12
Aspect-Best
Better-Cast
Referência:
- Michael
J. Folk e Bill Zoellick. File Structures, Second Edition,
Addison-Wesley, 1992.
Download

Acesso Sequencial Indexado