INE5408 Estruturas de Dados Gerência de Arquivos Introdução • Arquivo: – conjunto de dados em um dispositivo de armazenamento secundário (externo); – tipicamente: disco, disquete, fita, CD-ROM, MO-Disc, Zip, Jaz, etc. • Tipos de dispositivos: – Acesso Seqüencial • Fita (carretel, streamer, DAT, Travan); • dados só podem ser lidos na mesma ordem em que foram escritos; • escrita só é possível após o final da área utilizada. – Acesso Aleatório • Disco, CD, MO, disquete, Zip, Jaz; • dados podem ser lidos e escritos* em qualquer ordem. *à exceção do CD Características: memória secundária x RAM • RAM – Vantagens: • rápido acesso; • fácil de alterar. – Desvantagens: • volátil (dados desaparecem quando desligamos a máquina). • Dispositivos de Armazenamento Secundário – Vantagens: • espaço muito maior do que memória primária (RAM); • conservativos (dados não desaparecem quando desligamos a máquina). – Desvantagens: • acesso comparativamente muito lento; • alteração/inclusão de dados às vezes ainda mais lenta. Dispositivos de Acesso Seqüencial • Exemplo típico: Fita • Extremamente lentos • Utilizados para: – armazenar dados que vão ser acessados todos de uma só vez e – não vão mais ser alterados. • Uso típico: Backup • A gerência de arquivos não se ocupa muito destes dispositivos. Dispositivos de Acesso Randômico / Aleatório • Exemplo típico: Disco • Relativamente rápidos • Utilizados para: – dados que sofrem freqüentes pesquisas – dados muito alterados ou não definitivos • Uso típico: área de trabalho ou banco de dados • Base para as técnicas que serão vistas Gerência de Dados: noção intuitiva • Usamos RAM para armazenar dados temporariamente enquanto estamos processando-os; • usamos dispositivos de armazenamento secundário para guardar dados não processados e dados depois de processados. • Solução Intuitiva: um programa carrega todos os dados que necessita em uma estrutura de dados na memória, os processa completamente e depois os escreve de volta. • Problemas: – dados podem não caber na memória; – ler e depois reescrever todos os dados de um conjunto toma muito tempo. Pode ser que estejamos interessados em processar somente uma pequena fração do conjunto. Gerência de Arquivos • Definição: conjunto de métodos e técnicas para (eficientemente): – – – – – – – classificar arquivos e conteúdo de arquivos; fazer busca de dados em arquivos; acrescentar dados a arquivos; eliminar dados de arquivos; alterar valores de dados existentes em arquivos; copiar arquivos; alocar, desalocar e manter espaço em dispositivos de armazenamento secundário para manter arquivos. • Maior restrição: Tempo Gerência de Arquivos: objetivo principal • Solução para o problema da leitura/escrita de todos os dados: – – – – trabalhamos com os dados organizados em arquivos; só trazemos para a memória dados que queremos alterar; só escrevemos em disco novos dados que queremos incluir; só retiramos do disco dados que queremos eliminar. • Fator mais restritivo: o tempo de acesso aos dados – Organizamos os arquivos de forma a minimizar o tempo de acesso aos dados; – eficiência na organização tem prioridade maior que economia de espaço (pode ser desperdiçado moderadamente). Gerência de Arquivos: princípio básico • Organizamos os dados de forma a minimizar o número de acessos à memória secundária para executar uma operação (procura, inserção, alteração, deleção). • Para isso utilizamos: – organizações de dados mais rígidas do que na memória (mesmo que isso signifique desperdício de espaço); – técnicas de indexação; – algoritmos de busca. Disco • Exemplo típico para uma memória secundária de acesso aleatório; • compreender a forma de armazenamento é importante; • modelo de estruturação do disco serve para todos os outros meios secundários. Modelo simplificado • Dados são organizados em superfícies, trilhas, setores e blocos; • um arquivo pode ser imaginado como sendo constituído por uma seqüência de dados no disco; • o acesso é feito através do posicionamento de um cabeçote de r/w em qualquer ponto; • uma unidade de alocação do disco (um bloco ou um setor) possui um endereço físico no disco; • podemos endereçar estes da mesma forma que fazemos com a RAM. Modelo simplificado Setor Superfície de um Disco Arquivo ocupando dois setores Trilha Modelo mais realista • O disco pode apresentar fragmentação: os dados não estão exatamente em espaços contíguos, mas em unidades de alocação longe umas das outras, encadeadas como uma lista; • o encadeamento é tarefa do sistema operacional e do hardware (controladora) do disco. Modelo mais realista Setor Superfície de um Disco Trilha Exemplo: disco real Disco: para trabalhar Início • Tudo o que precisamos para trabalhar com técnicas de gerência de arquivos é imaginar: – que um arquivo é uma seqüência de dados sem “buracos” no meio; – que podemos acessar qualquer parte deses dados através de seu endereço relativo (a partir do início); – que só podemos incluir dados novos no fim; – dados do meio só podem ser alterados. – Apagar um dado significa marcá- lo como apagado ou substituí-lo por outro ! Fim Tipos de arquivos Há basicamente dois tipos de arquivos, vistos sob o ponto de vista do armazenamento de informação: • Arquivos de Formato Variável • Arquivos de Registros Arquivos de Formato Variável • São arquivos onde a única unidade de endereçamento possível é o byte; • os arquivos não são organizados em estruturas. Exemplo típico: arquivos texto – Mesmo sendo os arquivos texto organizados em linhas, estas têm tamanho variável e não servem para endereçar o arquivo - você não sabe a que distância do começo do arquivo a “linha 13” está. • São tratados como arquivos de acesso seqüencial. Arquivos de Registros ou de Acesso Randômico • São arquivos organizados em unidades (maiores que 1 byte) de tamanho sempre igual, chamadas registros. – Registros têm a mesma filosofia que as structs em “C” ou records em Pascal; – são conjuntos de dados com tamanho fixo, mesmo que uma parte não seja aproveitada; – permitem que sejam usados como unidade de endereçamento relativa. Ex.: “Registro 34278”. Ex.: podemos armazenar um nodo de uma árvore como um registro. O ponteiro “direita” apontará para o endereço relativo de um registro representando outro nodo no arquivo. – Técnicas de Gerência de Arquivos são voltadas aos Arquivos de Registros. Acesso a registros • Quase todas as linguagens de programação provêm uma facilidade para o acesso a arquivos de endereçamento randômico. – Ex.: seek(arquivo,posição) em Pascal. – Ex.: fseek(arquivo*,posição,SEEK_SET) em “C”. • O acesso é feito simplesmente fornecendo-se o endereço relativo (número de registro): – o resto (encontrar a trilha e o setor, posicionar o cabeçote, etc.) é incumbência do sistema operacional e do hardware do dispositivo e é transparente ao programador/usuário. • Feito o acesso pode-se realizar uma operação de leitura ou escrita. Definições • Registro Elemento básico de um arquivo de acesso randômico: – todos os registros de um arquivo têm o mesmo tamanho. • Item de Dados É o campo de um registro. • Ocorrência É uma instância de um registro com determinados valores. • Organização Física A forma de organização de um arquivo, sua estrutura (de dados e de índices): – contrapartida ao conceito de Estrutura de Dados. Escolha da organização de arquivos • Principal objetivo: – fornecer caminhos de acesso aos registros durante as operações de recuperação e atualização de dados. • Critérios: – consultas sempre envolvem buscas. Os caminhos de acesso aos registros devem tornar essas buscas o mais eficientes possível. • Depende: – dos tipos de consultas permitidas; – do número de chaves (só uma ou chaves secundárias). Ex.: vamos indexar uma lista telefônica só por nome ou também por rua ou número? – Modos de recuperação e de atualização. Tipos de consulta empregado : registro { nome : string cargo : string salário : inteiro dataBase : data endereço : string } • Consulta simples: cargo = “motorista” • Consulta em uma faixa: salário • Consulta booleana: cargo > 560 = “motorista” E salário > 300 E dataBase = 15/12/2007 Indexação • Podemos usar um campo de uma estrutura de registro para “identificar” esse registro. Chamamos a este campo de chave. • Índice é uma estrutura de dados que mantém o conjunto de chaves de um arquivo e seus endereços e serve de referência para os registros. – Índice Primário (ou Indexação por Chave Primária) é um índice único que organiza o arquivo através do campo considerado “mais importante” ou “identificador” da sua definição de registros. Ex.: “empregado” por nome. – Índice Secundário (ou Indexação por Chave Secundária) é um índice que organiza o arquivo referenciando outro campo ou combinação de campos. Ex.: indexamos “empregado” por nome e por data-base. Data-base é um índice secundário. Métodos de gerência/organização • Arquivos Seqüenciais – Primária • Arquivos Indexados Seqüenciais – Primária • Árvores – AVL, B • Primária – K-D • Primária, Secundária • Listas (Primária e Secundária) – Multilista – Arquivo Invertido Arquivos seqüenciais • Um registro está atrás do outro: – leitura é realizada seqüencialmente; – escrita só no final. • Indexação: Ordenação por Chave Primária – Indexação Primária: podemos ordenar o arquivo pelo campo chave. Semelhante à lista ordenada em um vetor. – Vantagem: acesso seqüencial de um conjunto de dados é o mais rápido. • Útil quando sempre tenho de processar quase todos os elementos. – Desvantagens: inclusão e exclusão é extremamente custosa. Duas soluções: • cópia; • inclusão/exclusão com o algoritmo da lista ordenada em vetor. Exemplo: inclusão em Arquivo Seqüencial com Chave 0015 Início 0001 0002 0005 0012 0014 0016 0018 0028 0045 0050 0056 Exemplo: inclusão em Arquivo Seqüencial com Chave Início 0001 0002 0005 0012 0014 0016 0018 0028 0045 0050 0056 Início 0001 0002 0005 0012 0014 Exemplo: inclusão em Arquivo Seqüencial com Chave Início 0001 0002 0005 0012 Início 0001 0002 0005 0012 0014 0014 0016 0015 0018 0028 0045 0050 0056 Exemplo: inclusão em Arquivo Seqüencial com Chave Início 0001 0002 0005 0012 Início 0001 0002 0005 0012 0014 0014 0016 0015 0018 0016 0028 0018 0045 0028 0050 0045 0056 0050 0056 Arquivos Indexados Seqüenciais • Arquivos Seqüenciais passíveis de serem acessados através de tabelas de índices. • Exemplo mais típico: ISAM (IBM): – Indexed Sequential Access Method; – mais utilizado método de gerência de arquivos durante muito tempo; – suportado por linguagens de programação MUITO velhas como COBOL ou PL/1; – existia como pacote de software disponível inicialmente só para mainframes (Ex.: IBM 4341 e linha VMS); – mais tarde passou a existir também para PCs sob DOS. Arquivos Indexados Seqüenciais: características • Arquivo ordenado por chave primária; • tabela de índices também ordenada por chave primária é usada para acessar áreas do arquivo. – Originalmente essas tabelas ficava no começo do próprio arquivo. • Tabela de índices pode ter vários níveis (índice hierárquico ou “quase-árvore”); • inserções são realizadas na área de overflow ou área de espaço livre. Também indexada na tabela; • deleções somente são marcadas; • atualização periódica através de cópia do arquivo. Arquivos Indexados Seqüenciais Idéia geral Índice de Acesso Início 0001 0002 0005 0012 0012 0014 0012 0016 0018 0018 0018 0028 0056 0045 0056 0050 0056 Área de Espaço Disponível ou Overflow Area Arquivos Indexados Seqüenciais Inserção do 15 Índice de Acesso Início 0001 0002 0005 0012 0012 0014 0012 0016 0018 0018 0018 0028 0056 0045 0056 0050 0056 0015 Área de Espaço Disponível ou Overflow Area Arquivos Indexados Seqüenciais Início 0001 0002 Índice de Acesso 0005 0012 0012 0014 0012 0016 0018 0018 0018 0028 0056 0045 0056 0050 0056 0015 Elemento é inserido na área de Espaço Disponível 0015 Museu revisitado: ISAM original Museu revisitado: ISAM original