









Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Literatura
Tipologia: Notas de estudo
1 / 15
Esta página não é visível na pré-visualização
Não perca as partes importantes!










Apesar da alta disponibilidade e custo em constante decréscimo de dispositivos de armazenamento de dados como discos rígidos e memória de acesso aleatório, o volume de dados sempre será um fator importante para aplicações intensivas sobre os dados, como os próprios sistemas de banco de dados, e para resolver os desafios de áreas como geografia e biologia cujas descobertas vêm gerando grandes volumes de dados.
Por esta razão, a compressão ou compactação de dados pode ser considerada como uma estratégia para reduzir o espaço de armazenamento físico, melhorar as taxas na transferência de dados, especialmente em aplicações distribuídas, e ainda, para obter melhor desempenho em aplicações intensivas sobre os dados.
Nesta seção serão introduzidos conceitos, aplicabilidade e principais soluções sobre compactação de dados, com ênfase no caso de dados armazenados em SGBDs. Por fim será analisado o caso especifico dos bancos de seqüências de DNA ou biosseqüências.
A compressão de dados é a transformação ou codificação de um conjunto de símbolos em outro com um tamanho reduzido [LH87]. A compressão de dados é estudada dentro da teoria da codificação, uma das aplicações diretas mais relevante da teoria da informação [WIT06]. Alguns textos em inglês fazem a diferenciação entre os termos compactação e compressão, usando o primeiro para expressar as técnicas de codificação reduzida que não preserva toda a informação, neste trabalho estes termos serão usados como sinônimos.
Por codificação entende-se como um processo para levar de uma representação a outra. O dado transformado é chamado de código. O primeiro componente de uma codificação é a entrada , como por exemplo, um arquivo texto. O segundo componente é chamado de codificador , e é onde está implementada toda a lógica da codificação, e por último, como saída, está o código gerado, a nova representação dos dados da entrada.
No entanto, a compressão de dados não é como outras codificações, como por exemplo, códigos para transmissão de dados, um protocolo, ou ainda codificações com o fim de resguardar a segurança da informação. A compressão de dados utiliza uma codificação como uma estratégia de armazenamento de dados e otimização de aplicações.
Definimos esquema de codificação como um algoritmo de codificação. Os dados de entrada são tratados como palavras, ou seja, a leitura vai acontecendo até ser encontrada uma seqüência de símbolos para gerar a codificação. Com relação ao tamanho dos dados de entrada, pode ser considerada como uma palavra cada caractere ou símbolo, ou ainda, seqüências de tamanho maiores. É possível ter entradas formadas por palavras de tamanho fixo ou tamanho variável. As palavras de tamanho fixo têm sempre o mesmo tamanho ou número de símbolos, já em tamanho variável, o conjunto é formado por palavras de tamanhos diferentes. Por exemplo, o alfabeto de entrada AE 1 = {a,e,i,o,u} contém palavras de tamanho fixo, e AE 2 = {”estava”, “estávamos”, “estavas”, “estavam”}, palavras de tamanho variável.
Uma codificação é considerada distinta se existe um mapeamento de um para um entre as palavras do alfabeto de entrada para o código gerado. Ou seja, para cada palavra lida é gerado um único código, e vice-versa.
Para uma codificação distinta, se diz que a saída é independente do prefixo quando um código pode ser decodificado sem a necessidade de ler os caracteres que o seguem. Por exemplo, seja o conjunto C = {“1”, “100000”, “00”} e a palavra “1000000001” para ser decodificada. Ao ler o primeiro caractere não é possível definir a palavra correspondente no conjunto pré-definido dos códigos já que poderia ser a primeira opção, “1”, ou a segunda “100000”. E assim, ao ler o próximo caractere, “0”, tampouco é esclarecido, pois ainda poderia ser a primeira palavra do conjunto e o início da terceira. Somente com a leitura do último caractere é possível saber, já que, se o número de zeros fosse ímpar, corresponderia à segunda palavra, mas neste caso, “1000000001” seria decodificada como “1”, “00”, “00”, “00”, “00”, e “1” [LH87].
Por definição, a compressão de dados busca detectar redundância nos dados e tenta removê-la através de uma representação reduzida. Comumente isto é conseguido usando representações compactas para dados que mais se
Por outro lado, as reversíveis são aquelas que ao aplicar o processo contrário à compressão é possível obter os dados originais sem perda de informação. Esta técnica é geralmente usada para arquivos de texto.
Os algoritmos de compressão também podem ser classificados em estáticos e dinâmicos. Os algoritmos estáticos são aqueles cuja relação entre uma palavra e sua representação compactada é única. Já para os dinâmicos ou adaptativos , a codificação varia com o tempo. Por exemplo, ao codificar os primeiros dados, uma palavra pode aparecer com alta freqüência e, em conseqüência, ser representada por um código menor, enquanto para outras partes da leitura da entrada que está sendo codificada, a mesma palavra pode ser substituída por um código de maior tamanho.
Outro critério comumente adotado para agrupar estratégias de compressão de dados é a dependência em relação aos dados de entrada. Assim, existem soluções que exploram características próprias dos dados para gerar uma codificação. Estas soluções são chamadas de semanticamente dependentes ou baseadas no contexto (context-based). Por outro lado, as soluções que podem ser aplicadas em qualquer contexto são classificadas como semanticamente independentes.
A eficácia de uma compactação é medida pela taxa de compressão, dada pela fórmula apresentada no Figura 12. Nesta fórmula quanto maior o valor da taxa de compressão maior será a redução no arquivo de dado original.
Tamanho do arquivo original Taxa de compressão = ___________________________________ Tamanho do arquivo compactado Figura 12 - Fórmula para Cálculo de Taxa de Compressão
A seguir são apresentados os principais algoritmos de compressão de dados aplicáveis a qualquer contexto. Serão expostas as características de cada um dos algoritmos de acordo as definições apresentadas acima, uma avaliação da taxa de compressão e complexidade.
Os algoritmos mais populares de compressão reversível podem ser agrupados em duas categorias:
A primeira categoria engloba os algoritmos que utilizam a freqüência de cada palavra da entrada para definir a nova representação, sendo que caracteres mais freqüentes são representados por um código de menor tamanho e os menos freqüentes, códigos maiores. Já nas técnicas baseadas na substituição de caracteres, ou modelagem baseada em dicionário, é construída uma tabela com as palavras que vão sendo lidas da entrada e associando códigos às mesmas. Em ocorrências posteriores ao registro da palavra na tabela, faze-se referência ao código associado na primeira leitura da palavra.
Um dos principais representantes da primeira categoria é o algoritmo de Huffman. Este esquema, que associa códigos às palavras segundo as probabilidades de ocorrência das mesmas na entrada, foi criado em 1952 por David Huffman [Huf52]. Esta solução gera códigos de tamanho variável a partir de palavras de tamanho fixo. Em arquivos texto, cada caractere é considerado como uma palavra a ser codificada, e os códigos gerados são independentes do prefixo, isto é, a cadeia de bits que representa uma palavra dada nunca é o prefixo da representação de outra palavra.
Existem variações estáticas e dinâmicas do algoritmo. Nas últimas, a tabela de freqüências dos caracteres iniciais, parte da lógica do codificador, vai sendo adaptada durante o processo de compressão e, posteriormente, na descompressão.
Como o código de Huffman pode ser aplicado a qualquer área de conhecimento, como arquivos textos, arquivos de imagens e sons, comprimindo byte a byte , a taxa de compressão pode variar dependendo das características da redundância dos dados de entrada.
Existem muitas adaptações e variações baseadas no algoritmo de Huffman, como as que realizam algum pré-processamento sobre os dados de entrada para melhorar a taxa de compressão ou ainda exploram características do contexto [Cor85]; assim como implementações que exploram estruturas de
Existem outros esquemas para tratar a compressão de diferentes tipos de dados, como aqueles presentes em sistema de banco de dados relacionais, explorando-se a arquitetura destes sistemas e as características dos diferentes tipos de dados contidos nessas aplicações, assim também como outras áreas de pesquisa como a biologia. Na seção seguinte são detalhados os requisitos dos sistemas de banco de dados e os esquemas de compressão propostos para esta área. Em seguida, são apresentadas as soluções para as biosseqüências, objeto de estudo deste trabalho.
A estruturação, acesso e manipulação de grandes volumes de dados sempre foi uma questão importante na construção de aplicações denominadas intensivas sobre os dados. De um modo em geral, foi observado que subconjuntos desses grandes volumes de dados compartilham propriedades e estruturas de dados similares[RV93], como por exemplo o formato de um campo para armazenar números de telefone.
Os SGBDs foram criados com o objetivo de permitir que aplicações intensivas sobre dados possam ser construídas mais facilmente fornecendo um grau de transparência quanto às estruturas dos dados utilizadas e a forma de acessá-los e manipulá-los. Além disso, SGBDs visam oferecer mecanismos eficientes para operar sobre esses volumes de dados. Diante deste desafio, surgiu um modelo específico de banco de dados denominado de SGBD relacional (SGBDR) o qual introduziu a abstração de tabela (relação, da matemática) permitindo assim o armazenamento e manipulação de dados relacionados de forma mais homogênea, ou seja, fazendo uso da propriedade de similaridade e relacionamento apresentado nos grandes volumes de dados.
Apesar do sucesso obtido pelo SGBDs relacionais, é grande o desafio de se garantir um bom desempenho diante de grandes volumes de dados que continuam a crescer constantemente. Em domínios específicos como da biologia, se observa uma duplicação a cada 14 meses das fontes de dados biológicas^3 , além do surgimento de dados com semânticas específicas como é o
(^3) Fonte: http://www.ncbi.nlm.nih.gov/Database/index.html.
caso das biossequências, cujas propriedades foram apresentadas no capítulo 2. Desta forma, existe um grande desafio para SGBDs tradicionais em lidar com esses novos domínios que apresentam um crescimento constante no volume de dados.
De modo geral, os SGBDs se valem do acesso rápido à memória principal para reduzir o tempo de latência da aplicação no acesso aos dados que serão úteis para seu processamento. Manter páginas de dados em memória principal para provável uso futuro garante também maior eficiência no acesso aos dados. Enxergando o SGBD como um produtor de dados para as aplicações que os consomem, identificam-se três fatores que possuem influência direta na eficiência do SGBD em responder às demandas das aplicações: o volume de dados a ser manipulado, a natureza do dado a ser manipulado e o padrão de consumo dos dados das aplicações.
A natureza do dado está relacionada com as propriedades intrínsecas dos dados, como no caso de texto, imagem, vídeo, e com sua forma de representação, numérica, alfanumérica ou binária. Um SGBD faz uso dessas propriedades para definir estruturas de dados específicas aliadas a métodos de acesso que as manipulam. Este é o caso, por exemplo, de dados multidimensionais que necessitam de estruturas específicas para sua manipulação e acesso como, por exemplo, as conhecidas árvores R [Gut84].
O padrão de consumo de dados é definido a partir do modo como a aplicação faz uso deste dado. Por exemplo, uma determinada aplicação pode consumir os dados seqüencialmente, usando uma ordem pré-definida ou de forma aleatória. Os SGBDs utilizam técnicas para interpretar as demandas das aplicações trabalhando de forma pró-ativa no sentido de antever as suas futuras necessidades. O exemplo mais conhecido desta estratégia são as leituras antecipadas de dados ( prefetch reads ) visando trazer páginas de dados para a memória principal antes mesmo que estes sejam solicitados pela aplicação.
Como comentado no início do capítulo, a compressão tem como objetivo principal detectar as redundâncias nos dados e removê-las através de uma representação reduzida. Aplicando-se esse objetivo aos SGBDs é possível concluir que a compressão aplica-se ao fator referente ao volume de dados como forma de reduzir o número de operações de entrada e saída. Os dados compactados ocupariam menos espaço em disco e, com isso, um menor número
Entre as desvantagens advindas do uso de compactação em banco de dados podemos ressaltar:
A compactação de dados é utilizada na maioria dos SGBDs comerciais. Como por exemplo, a versão mais atual do Oracle[OB05], o Oracle 10G, comprime os dados de um bloco ou página de disco criando uma tabela no início de cada bloco com os valores repetidos dentro das linhas de dados contidas no bloco. Desta maneira, cada bloco é auto-contido, ou seja, para descompactar um bloco é necessário somente o bloco. Outra vantagem da utilização desta técnica, do ponto de vista de implementação, deve-se a alteração do sistema apenas nas funções que manipulam blocos de dados, sendo transparente para os demais níveis de manipulação dos dados.
Também o DB2[RAV06] conta com uma forma de persistência compactada que explorar a freqüência de repetição dos valores em cada fila de uma tabela que pode ser utilizada pelos administradores do sistema. Este recurso é chamado Venom.
Como já mencionado, a idéia por trás desta técnica é eliminar as redundâncias de certas porções da seqüência usando uma codificação reduzida. Entretato, a simples aplicação de esquema para compressão baseado em estatísticas, por exemplo, não garante bons resultados de compactação em todos os casos, já que para as seqüências biológicas, mesmo com a presença de regiões com repetição de padrões e redundância, a regularidade da aparição de um caractere de acordo ao contexto não é tão simples como com textos comuns em língua portuguesa, por exemplo.
Ao mesmo tempo a preponderância de padrões de repetição é um fenômeno importante nas seqüências biológicas. Estas repetições podem ser randômicas muito provavelmente devido ao tamanho dos arquivos de seqüências em relação ao alfabeto bastante pequeno, ou ainda podem representar alguma informação biológica como a mutação no caso de uma duplicação de um gene[AZM+02].
Por outro lado, considerando que as seqüências de DNA são formadas por quatro letras (a, c, t, g), excluindo as ambigüidades, e as de proteínas por possíveis vinte letras, uma idéia simples de compressão usaria somente 2 bits para representar cada base no primeiro caso e 5 bits no segundo. Desta maneira, os algoritmos de compressão a serem testados com este tipo de arquivo, para garantir uma taxa de compressão ainda maior, devem usar menos bits que os citados acima.
Tais fatos e o estudo das propriedades deste tipo especial de texto, as biosseqüências, como a existência de palíndromos e repetições exatas ou aproximadas, e outras apresentadas no capítulo 3, acabam gerando um novo desafio para a compressão de dados, já que é possível verificar que estes dados apresentam características tais que, uma vez exploradas, poderiam gerar esquemas com taxas boas de compactação, talvez melhores que com a utilização de esquemas tradicionais como Huffman, codificação aritmética entre outros.
Deste modo, as biosseqüências são candidatas à compressão por apresentar redundância de dados. A chave do problema se torna como identificar dentro de um tempo razoável as estruturas de repetição, e como fazer
Na segunda linha de algoritmos próprios para biosseqüências está a proposta de [TKR03]. O método é conhecido como NMLComp , um modelo normalizado para aproximação ( Normalized maximum Likehood model ). Esta implementação gerou resultados que comprovaram a redução nos requisitos computacionais deste método sem perder a precisão, já que é comprovadamente adequado para codificação a ser utilizada em buscas aproximadas.
Em [KT05] é discutida uma otimização mais flexível deste método que conseguiu representar cada base de uma biosseqüências com 1,490 bits ao ser testado contra um arquivo contendo seqüências do genoma humano.
Como explicada na seção 4.1.1, a eficácia de um algoritmo de compressão é medida pela taxa de compressão. Isto é, para dizer que um algoritmo é melhor que outro se deve comparar as taxas de compressão dos mesmos, obviamente dentro de um esquema preciso e correto de testes.
Porém, do ponto de vista do desempenho de um programa, tantos aspectos teóricos, da concepção em si do algoritmo, quanto aspectos práticos, diretamente da implementação, influenciam o resultado final.
Geralmente, na publicação de um novo algoritmo, ou utilização de um algoritmo existente em um novo domínio de dados, é suficiente a analise do primeiro item, ou seja, a taxa de compressão. Tem-se como primeiro problema, provar que os dados serão realmente compactados. Como segundo objetivo, é importante conhecer o desempenho do programa, principalmente em alguns domínios como o caso de banco de dados, nos quais o desempenho da descompressão afeta diretamente o desempenho do sistema como um todo.
Desta maneira é comum encontrar tabelas de comparação de programas de compressão de dados em publicações da área. A seguir, é apresentada a Tabela 8 , encontrada em [BW94], com alguns valores obtidos sobre os 14 arquivos da Calgary Compression Corpus[WB06]. Estes arquivos possuem formatos variados e são comumente utilizados para comparações entre algoritmos de compressão. O tamanho total dos 14 arquivos originais é de 3.141.622 bytes. Os programas compress e gzip são baseados na família LZ, já
o comp-2 é baseado no modelo estatístico. Como é possível observar na tabela, os programas de compressão podem apresentar desempenhos diferentes para a compressão e descompressão. Por outro lado, comprova-se que nem sempre o algoritmo que obtém uma boa taxa de compressão em comparação a outras implementações, é o mais adequado para ser usado em uma descompressão online , por exemplo, como o caso do programa comp-2.
Tempo total CPU
Tamanho do arquivo final
Taxa de Programa compressão compressão descompressão (bytes) bits/char compress 9,6 5,2 1.246.286 3, gzip 42,6 4,9 1.024.887 2, BWT (^) 51,1 9,4 856.233 2, comp-2 603,2 614,1 848.885 2, Tabela 8 - Comparação de programas de compressão de dados
Assim também, com esta tabela é possível observar que o algoritmo BWT além de apresentar uma taxa de compressão comparável ao modelo estatístico, tem um tempo de processamento próximo aos algoritmos baseados na família LZ, considerado os melhores[AZM+02]. Do ponto de vista da implementação, sua construção se vê facilitada por utilizar algoritmos que facilmente podem conseguir-se na literatura[Huf05] em versões otimizadas. Outra característica importante desta solução, que poderá ser útil na tentativa de compactação de biosseqüências, é a possibilidade de compactação e descompactação em blocos.
Neste capítulo foram apresentados os conceitos da compressão de dados em geral. Também foram introduzidos os problemas e as vantagens da utilização de compressão de dados em sistemas de banco de dados.
Por último, dado o foco do trabalho, foram resumidos os desafios do uso das técnicas de compactação sobre os tipos de dados das biosseqüencias, sendo apresentadas as principais soluções aplicadas a tais dados.
Desta maneira, foi possível constatar que a base para os algoritmos de compactação de dados é bastante antiga, e que geralmente novas soluções são