• Nenhum resultado encontrado

Operações de carga-rápida (bulk-loading) em métodos de acesso métricos

N/A
N/A
Protected

Academic year: 2021

Share "Operações de carga-rápida (bulk-loading) em métodos de acesso métricos"

Copied!
14
0
0

Texto

(1)

THIAGO GALBIATTI VESPA1 CAETANO TRAINA JÚNIOR1

1

USP - Universidade de São Paulo

ICMC - Instituto de Ciências Matemática e de Computação

Av. do Trabalhador São-Carlense, 400 - São Carlos, SP, Brasil, CEP 13560-970 {thiago, caetano}@icmc.usp.br

Resumo Neste trabalho, são apresentadas três abordagens, uma técnica para carga-rápida dos dados em

Métodos de Acesso Métricos e foi desenvolvido um algoritmo baseado nessa técnica para construir uma

Slim-tree. Este é o primeiro algoritmo de carga-rápida baseada em amostragem que sempre produz uma Slim-tree

válida, portanto é o primeiro descrito na literatura que pode ser incluído em um Sistema Gerenciador de Base de Dados. Os experimentos descritos neste trabalho mostram que o algoritmo proposto mantém bom agrupamento dos dados e supera o desempenho dos métodos de inserção seqüencial levando em conta tanto o desempenho de construção quanto à eficiência para realizar consultas.

Abstract. This work presents three bulk-loading approaches and it proposes a technique to bulk-load data

into Metric Access Methods. An algorithm based on this technique was developed to construct a Slim-tree. This is the first bulk-load algorithm based on sampling that always produces a valid Slim-tree, therefore is the first one described in literature that can be enclosed in a Database Management System. The experiments show that this algorithm keeps good clustering of data and in such a way that it surpasses the performance of sequential insertion, taking into account the construction performance and the efficiency to perform queries.

Keywords: Operações de carga-rápida, métodos de acesso, estruturas de indexação e recuperação de

conteúdo.

1 Introdução

Na tarefa de armazenar e recuperar dados de maneira eficiente, um Sistema Gerenciador de Base de Dados (SGBD) emprega os métodos de indexação como um recurso importante para a localização rápida dos dados armazenados em disco. Inicialmente, esses métodos foram desenvolvidos para atender a dados de tipos numéricos e seqüências de caracteres. Sobre esses dados, existem dois tipos de operadores de comparação: por igualdade (= e ≠) e relacionais (<, ≤, > e ≥). Esses seis operadores (dois de igualdade e quatro relacionais) são conhecidos como “the

big six” da linguagem SQL (Melton et al., 2002). Os

operadores de igualdade podem ser aplicados universalmente a qualquer dado, pois sempre é possível verificar se um dado é igual ou diferente do outro. Já os operadores relacionais são aplicáveis apenas em domínios de dados em que a comparação entre pares de elementos sempre permite decidir qual precede ou sucede o outro. Essa propriedade é conhecida como “Relação de Ordem Total” - ROT.

Contudo, uma nova geração de aplicações tem apresentado como requisito a necessidade de armazenar e

recuperar informações mais complexas, como imagens digitais, sons, vídeos e gráficos. A sofisticação desses tipos de dados exige um suporte diferenciado, pois não obedecem a ROT e os operadores de igualdade são de utilidade muito pequena, pois dificilmente existem elementos iguais na base de dados (Faloutsos, 1996).

Para poder proporcionar a busca desses tipos de dados, em tempo hábil, com operações adequadas e diante do volume crescente de informações, faz-se necessário o uso de Métodos de Acesso (MA) que utilizem operações relevantes e adequadas aos dados a serem indexados. Por exemplo, em um Sistema de Informação Geográfica (SIG), toda informação é referenciada espacialmente por suas coordenadas geográficas (norte, sul, leste, oeste).

Os Métodos de Acesso Multidimensionais (MAMd) preocupam-se em disponibilizar consultas em que existe a noção de dimensão. No entanto, muitos dados, como imagens, séries temporais, textos longos, seqüências genéticas, não apresentam a ROT e nem a noção de dimensão. Conseqüentemente, não é possível realizar consultas utilizando os operadores relacionais e nem consultas topológicas ou cardinais. Por exemplo, em

(2)

sistemas que utilizam Recuperação de Imagens Baseada em Conteúdo (CBIR), o fator “similaridade” é fundamental. Por isso, os tipos de consultas requisitadas pelas aplicações afetam diretamente o método de acesso utilizado. Não há sentido em considerar que uma imagem está antes de outra, ou que uma seqüência genética é adjacente ou está ao norte de outra. De fato, não é possível ordenar esses elementos, a menos que sejam associados a um atributo não complexo ou em uma ordem que tenha um sentido útil para operações de recuperação, como nome, data, tamanho, etc. Para esses tipos de dados, foram desenvolvidos MA que suportam consultas por similaridade (Faloutsos, 1997). Os Métodos de Acesso Métricos (MAM) suprem essas consultas. Para isso é utilizada uma função de distância para comparação, em que a proximidade de elementos indica sua similaridade.

Nos MAM, a distância entre pares de elementos é definida por uma função de distância que respeita as propriedades de simetria, não negatividade e desigualdade triangular, conhecida como métrica. Esta função recebe como parâmetro um par de elementos e retorna um valor não negativo que indica o grau de dissimilaridade entre esses elementos. O domínio desses dados é conhecido como espaço (ou domínio) métrico. Com isso, qualquer dado que possa ser comparado com outro utilizando uma métrica pode ser indexado por um MAM, não necessitando da noção de dimensão ou mesmo da ROT.

Para a indexação de elementos e a construção de qualquer MA existem pelo menos dois tipos de operações de inserção possíveis: elemento a elemento

(tuple-loading) ou utilizando a operação de carga-rápida (bulk-loading). A inserção elemento a elemento é uma operação

básica, obrigatória e disponível para qualquer método de acesso utilizado em um SGBD, pois os elementos sempre podem ser inseridos um a um na base de dados. A carga-rápida, embora não seja obrigatória, é utilizada quando tem-se um conjunto significativo de dados e com isso pode-se aproveitar algumas características intrínsecas para criar o índice de forma otimizada e rápida.

Operações como restauração de backups em base de dados, criação posterior ou otimização do índice são exemplos do uso de operações de carga-rápida. Por ter todos os dados disponíveis, pode-se explorar as propriedades do conjunto, aproveitando o conhecimento de sua distribuição ou alguma característica fundamental que pode ser significativa para o método de acesso alvo, permitindo acelerar a construção da estrutura e, principalmente, melhorar as operações de busca em MA não tradicionais.

Uma das operações básicas que os MA tradicionais oferecem aos SGBD é a carga-rápida dos

dados, principalmente nas B-trees (Comer, 1979) (Johnson & Shasha, 1989) (Lomet, 2001) e suas derivadas, como a B*-tree e a B+-tree (Johnson & Shasha,

1993a) (Johnson & Shasha, 1993b) (Chong et al., 2001), amplamente utilizadas em SGBD comerciais. Neste caso, com os dados ordenados, o algoritmo de carga-rápida possui complexidade θ(n), n é o número de elementos a serem indexados, sendo que para os mesmo elementos indexados com operações de inserção individual, a complexidade é θ(n ∙ log(n)) (Bercken & Seeger, 2001). Esse tipo de operação é conhecido como carga-rápida baseada em ordenação (sort-based bulk loading). Os elementos são ordenados de alguma maneira e, então, é construída toda a estrutura. Em adição às técnicas baseadas em ordenação, existem as baseadas em buffer (buffer-based bulk loading) e em amostragem

(sample-based bulk loading).

As operações de carga-rápida baseadas em buffer foram desenvolvidas através de técnicas que utilizam áreas de armazenamento temporário para evitar o alto custo de acesso a disco. Uma técnica bastante conhecida na literatura é a Buffer-tree (Arge, 2003). De maneira sucinta, quando os dados não cabem mais em memória, essa técnica pode ser utilizada para manter a eficiência de algoritmos que funcionam apenas em memória principal. A maior desvantagem dessa técnica é que o desempenho depende da ordem de inserção dos dados e seu objetivo é apenas reduzir o custo de acesso ao disco, ignorando o custo de processamento (Ciaccia & Patella, 1998). Já as operações de carga-rápida baseadas em amostragem escolhem um conjunto de dados (amostras) a partir do conjunto a ser indexado com tamanho suficiente e compatível com o espaço disponível em memória principal e, após isso, tenta construir a estrutura de indexação com as informações obtidas nessas amostras. A vantagem dessa técnica é que os níveis inferiores da árvore podem ser construídos a partir do conjunto de amostras iniciais, criando agrupamentos dos elementos mais próximos, facilitando a consulta por similaridade entre os elementos. Um fator importante dessa técnica é que a qualidade das amostras obtidas pode influenciar no desempenho do algoritmo (Bercken & Seeger, 2001).

Apesar das operações em MA tradicionais estarem bem estabelecidas tanto na literatura quanto no meio comercial, pouca atenção foi despendida para os MA que utilizam dados complexos. Para esses tipos de dados não é recomendado, e às vezes nem possível, aplicar as técnicas de carga-rápida tradicionais baseadas em ordenação. Além disso, o modo de se fazer a carga-rápida em MA não tradicionais possui grande influência na qualidade de busca da estrutura de indexação.

(3)

A contribuição principal desse trabalho é um algoritmo de carga-rápida para MAM como a Slim-tree (Traina Jr et al., 2000) . O algoritmo proposto é baseado em amostragem e constrói uma árvore balanceada utilizando o limite controlado de elementos por nó para determinar o número adequado de elementos em cada etapa do algoritmo.

Os experimentos realizados mostram que esse método de carga-rápida é seis vezes mais rápido na construção em relação a inserção seqüencial e otimiza também o desempenho de consulta, tanto em relação à inserção seqüencial quanto ao algoritmo existente para o MAM M-tree.

Este documento apresenta as técnicas de operações de carga-rápida existentes e os algoritmos encontrados na literatura; após isso, são apresentados os algoritmos de carga-rápida desenvolvidos para o MAM

Slim-tree, e as abordagens utilizadas, considerando nós

com tamanhos fixos, tamanhos fixos por nível e tamanhos controlados para manter a estrutura balanceada. Para finalizar, são apresentados os resultados dos experimentos realizados com o algoritmo de carga-rápida para a

Slim-tree, comparando com a inserção seqüencial e o método

de carga-rápida existente para a M-tree. A última seção conclui o trabalho e apresenta propostas para trabalhos futuros.

2 Operações de carga-rápida

As operações de carga-rápida tentam utilizar as propriedades do espaço de indexação, juntamente com algumas formas de otimização, construindo a estrutura de indexação melhorada e de forma mais rápida em relação a inserção um a um, pois todo o conjunto de dados está disponível e sua distribuição é conhecida a priori. Em métodos com ROT, a operação de carga-rápida pode ser feita de maneira simples, ordenando e carregando os dados de maneira direta e, com isso construindo os níveis superiores sem grandes dificuldades. Já em métodos que não possuem ROT, são necessárias outras técnicas para realizar as operações de carga rápida, como a ordenação utilizando linearização do espaço, buffers ou agrupamento utilizando amostras do conjunto de dados.

As próximas seções descrevem as três técnicas existentes para a realização da operação de carga-rápida: as baseadas em ordenação dos dados (sort-based bulk

loading), as baseadas em buffers (buffer-based bulk loading) e as por amostragem dos dados (sample-based bulk loading). Finaliza-se apresentando algoritmos

genéricos específicos para MAM.

2.1 Carga-Rápida em Métodos com ROT

A maioria dos algoritmos para estruturas que suportam ROT é baseada em ordenação dos dados e os algoritmos são conhecidos como sort-based bulk loading. Como exemplo, em uma B+-tree, os elementos são ordenados e a

estrutura é criada de baixo para cima (bottom-up). Na execução do algoritmo de carga-rápida, define-se um novo nó raiz, com o primeiro ponteiro à esquerda apontando para o primeiro nó processado após a ordenação. Em seguida, cada nó é inserido no ponteiro à direita que ainda não aponta para nenhum nó. Quando o nó raiz está cheio, é feita a divisão do nó da maneira tradicional, criando um novo nó raiz, e assim a árvore cresce um nível. Apenas os nós do caminho à direita são mantidos em memória principal.

Apesar de apenas manter o mesmo desempenho nas consultas que a inserção seqüencial, esse algoritmo de carga-rápida dos dados possui complexidade θ(n), enquanto que a inserção seqüencial possui complexidade θ(n ∙ log(n)), onde n é o número de elementos a serem inseridos (Vitter, 1998).

2.2 Carga-Rápida para Dados Não Tradicionais

A operação de carga-rápida é bem conhecida para métodos como as B-trees, mas os algoritmos tradicionais de carga-rápida não são aconselháveis ou, até mesmo, não podem ser aplicados, pois não é possível aplicar a ROT para auxiliar na criação dessas estruturas. Além disso, em uma construção bottom-up, não há como prever a construção dos níveis superiores, o que torna difícil a operação de carga-rápida dos dados utilizando a ordenação dos dados da maneira convencional.

Algumas abordagens tentam linearizar o espaço de indexação utilizando curvas de preenchimento do espaço, para então aplicar a técnica de carga-rápida baseada em ordenação. Outras utilizam buffers para construir a estrutura sem sobrecarregar a memória principal e otimizar o acesso a disco, mas não levam em consideração o custo de processamento. Outra forma de realizar a carga-rápida é escolher amostras do conjunto a ser indexado, agrupar os elementos com relação à essas amostras e então construir a estrutura de cima para baixo (top-down).

As próximas seções descrevem as técnicas para operação de carga-rápida em MA sem ROT. Além disso, são descritos o algoritmo da M-tree e os algoritmos genéricos para MAMd e MAM encontrados na literatura.

(4)

2.2.1 Carga-Rápida Baseadas em Ordenação dos Dados

A execução da técnica de ordenação em alguns MA não tradicionais necessita que os dados sejam ordenados. Para isso, existem algumas técnicas conhecidas como técnicas de ordenação do espaço.

Uma técnica de ordenação consiste em, de alguma forma, ordenar o espaço em questão, linearizando-o para aplicaçãlinearizando-o das prlinearizando-opriedades da ROT. A mais tradicional técnica de ordenação para dados multidimensionais é o de curvas de preenchimento do espaço. Uma linha é traçada pelo espaço até preenchê-lo totalmente. Isso permite diminuir a dimensão para um sistema de dimensão um. Entre os exemplos de curvas de preenchimento do espaço existem: a Z-order (curva de

Peano), a Row Wise, a curva de Hilbert e a G-Gray

(Faloutsos & Roseman, 1989).

Outra forma de reduzir a dimensão é usar um algoritmo baseado em uma forma especial de particionamento do espaço. É conhecido como técnica da pirâmide (Berchtold et al., 1998a). A idéia básica é primeiramente dividir o espaço de dados em pirâmides bidimensionais partilhando o ponto central do espaço como topo. Em um segundo passo, cada pirâmide é dividida em partes paralelas à base. Após isso, valores são atribuídos, seguindo um critério, aos pontos de cada partição. Esses valores são conhecidos como pyramid

value.

O problema é que não existe uma ordem total entre os elementos não convencionais que preserve a proximidade espacial em nenhum dos métodos de redução de dimensionalidade (Gaede & G unther, 1998). Não há como ordenar esses elementos da mesma maneira que é feito com elementos em domínios com ROT. Essa característica inviabiliza o uso de operações de carga-rápida da maneira tradicional. Para resolver esse problema, foram criadas duas técnicas que utilizam as propriedades do conjunto para construir a estrutura utilizando algoritmos de carga-rápida. A próxima seção descreve essas duas técnicas.

2.2.2 Carga-Rápida Baseadas em Buffer e por Amostragem

Em adição aos métodos baseados em ordenação, existem duas outras formas para fazer a carga-rápida: baseando-se no uso de buffers e por amostragem dos dados. A primeira forma, também conhecida como buffer-based bulk

loading, utiliza a técnica da Buffer-tree (Arge, 2003). Essa

técnica pode ser utilizada para manter a eficiência de algoritmos de otimização que funcionam apenas em

memória principal. O problema é que o seu objetivo é apenas reduzir o custo de acesso ao disco, ignorando o custo de processamento (Ciaccia & Patella, 1998).

A técnica baseada em amostragem, ou

sample-based bulk loading, utiliza um sub-conjunto, que possa ser

colocado em memória, de elementos representantes escolhidos do conjunto a ser indexado (Lang & Singh, 2001). A partir disso, inferem-se algumas propriedades desse conjunto para a construção de toda a estrutura.

Na literatura, encontram-se alguns algoritmos para operações de carga-rápida em MAMd, como para as

R-tree e suas variantes (Berchtold et al., 1998a) (Arge et

al., 2002) (Lin & Su, 2004) e algoritmos genéricos para diversos tipos de MA classificados em duas categorias:

GP-trees - Grow and Post trees e OP-trees - Overlapping Predicate trees. Esse algoritmos são considerados

genéricos pois eles trabalham sobre interfaces definidas e que devem existir no MA utilizado. A segunda categoria é composta por uma sub-classe da GP-trees e está inclusa a maioria dos MA que possuem sobreposição (Bercken & Seeger, 2001). Em (Ghanem et al., 2004) são propostos algoritmos baseados no particionamento de espaço para alocação de regiões que aproveitam a disponibilidade de

buffers.

Sem considerar o algoritmo genérico da

GP-trees, existe apenas um algoritmo de operação de

carga-rápida em espaços métricos utilizando amostragem: o algoritmo da M-tree.

2.2.3 Carga-Rápida na M-tree

Um algoritmo de carga-rápida utilizando a técnica baseada em amostragem dos dados foi desenvolvido para a M-tree (Ciaccia & Patella, 1998). As sub-árvores, inicialmente não balenceadas, são construídas de maneira

top-down e de acordo com a proximidade entre os

elementos. Após essa primeira etapa, é feito o balanceamento para tentar gerar uma M-tree completa e balanceada.

Esse algoritmo pode ser descrito da seguinte maneira: Seja S = {s1, ... , sn} o conjunto dos dados a

serem indexados. Inicialmente, escolhe-se aleatoriamente uma amostra de k elementos {sf1, ... , sfk} de S, inserindo

em um conjunto de amostras F. Associam-se, então, cada elemento de S à amostra mais próxima, produzindo k conjuntos {F1, ... , Fk}. Cada nó representante, é então

associado a um sub-conjunto. Isso é feito recursivamente até que todos os elementos sejam inseridos. Depois dessa etapa, tem-se uma árvore não balanceada.

O particionamento do conjunto de dados depende fortemente da escolha da amostra: amostras em regiões

(5)

menos densas deverão produzir sub-árvores mais baixas, uma vez que os conjuntos correspondentes terão cardinalidades mais baixas, enquanto amostras em regiões densas deverão produzir sub-árvores mais altas (Figura 1).

Para balancear a estrutura podem ser utilizadas duas técnicas:

1. associam-se novamente os elementos dos conjuntos não preenchidos em outros conjuntos e elimina-se a amostra correspondente de F; ou 2. quebram-se as sub-árvores maiores, obtendo um

número de sub-árvores menores. As raízes das sub-árvores obtidas serão inseridas no conjunto amostra F, substituindo a amostra original. Com isso, pode-se ter uma M-tree completa e balanceada, construída de maneira mais rápida que a inserção elemento a elemento. O problema é que esse algoritmo não garante a ocupação mínima e pode produzir árvores com apenas um único representante e conjuntos com apenas um único elemento em vários nós. Quando isso ocorre, é necessário repetir todo processo do começo escolhendo um novo conjunto de amostras. Esse processo pode ser bastante custoso e há chances de o algoritmo nunca produzir uma M-tree válida, portanto esse algoritmo de carga-rápida não pode ser utilizado como parte de um SGBD.

2.2.5 Carga-Rápida Genérica Para Estruturas com Sobreposição

Em (Bercken & Seeger, 2001) foram propostos algoritmos genéricos para diversos tipos de MA classificados em duas categorias: GP-trees (Grow and Post trees) e

OP-trees (Overlapping Predicate OP-trees).

A primeira categoria é dedicada a MA que possuem algoritmos de escolha de sub-árvores e algoritmos de divisão que trabalham de forma recursiva, enviando informações sobre a divisão como retorno. Para

isso, o algoritmo assume que as estruturas tenham uma interface com as seguintes funções:

chooseSubtree - Recebe como entrada um

elemento e o seu nó índice. Como resultado, é retornada uma referência à sub-árvore na qual o elemento de entrada deverá ser inserido.

grow - Recebe como entrada um elemento e um

nó, inserindo o elemento neste nó.

split & post - Recebe como entrada um nó com

um elemento a mais do que a sua capacidade máxima. Então, divide o nó em outros dois e envia informações sobre a divisão como, por exemplo, uma nova referência ao nó pai criado.

search - Recebe como entrada um tipo de

consulta e um nó. Retorna todos os elementos armazenados no nó relevantes à consulta.

Com essas informações, a inserção é feita por nível utilizando buffers. Quando todo o conjunto cabe em memória a estrutura é criada de uma única vez. Caso contrário, cada elemento é inserido utilizando o método

chooseSubtree recursivamente até chegar em um nó

folha. A seguir, o elemento é inserido em um buffer associado ao seu respectivo nó folha. Quando os elementos não cabem mais em memória, são criados novos nós com os elementos que estão nos buffers e são invocados os outros métodos para contruir a estrutura válida.

O algoritmo descrito anteriormente é conhecido como Path-based Bulk Loading. Sua maior desvantagem está na construção de estruturas que possuem sobreposição, pois o método chooseSubtree pode não ficar restrito a um único caminho. Outro problema é que o algoritmo ignora o custo de processamento intrínseco ao método chooseSubtree. No caso médio de inserção, os elementos são igualmente distribuídos nos buckets, a complexidade é de θ(n ∙ logm(n)), onde n é o número de

elementos a serem inseridos e m é o número de buckets em memória. No pior caso, onde todos os elementos são inseridos em um único buffer, a complexidade é de θ(n2/m).

Além dos MA englobados por esse algoritmo, existe outra categoria: as trees. A categoria das

OP-trees é uma sub-categoria das GP-OP-trees. Nela estão

inclusos os MA que possuem sobreposição, como por exemplo, a M-tree, a Slim-tree e a R-tree. O algoritmo para execução de carga-rápida genérica para essas estruturas é conhecido como Quickload.

A idéia básica do Quickload é retirar uma amostra de elementos dividindo-os em partições. O algoritmo é então aplicado de maneira recursiva para cada Figura 1: Exemplo do algoritmo de carga-rápida para

M-tree. Desbalanceamento da estrutura: amostras em regiões

mais densas possuem sub-árvores mais altas (Ciaccia & Patella, 1998)

(6)

partição. Se toda a entrada couber em memória principal, as páginas em memória interna correspondem aos nós folha da estrutura alvo. Caso contrário, o algoritmo processa os nós até que a memória esteja cheia. Depois são criados buckets para armazenamento temporário e anexados aos nós folha. Dessa forma, as inserções e distribuições dos elementos utilizando o algoritmo de escolha do nó de inserção (chooseSubtree) são realizadas nesses buckets. Apesar de efetuar as atualizações dos ponteiros, a estrutura não será modificada enquanto os elementos estiverem sendo distribuídos entre os buckets.

Quando todos os elementos da entrada inicial forem tratados, podem ocorrer dois casos: bucket vazio ou não. Se existir um bucket vazio, o nó folha que possui esse

bucket associado é inserido em disco, liberando espaço em

memória. Por outro lado, se o bucket não estiver vazio, um par, consistindo em um ponteiro para a folha correspondente e um ponteiro para a estrutura de armazenamento, é inserido em uma lista para processamento do algoritmo.

O algoritmo é então aplicado recursivamente utilizando os elementos dessa lista. Quando a lista torna-se vazia, têm-torna-se os ponteiros para os nós folha da estrutura. Esses ponteiros são utilizados pelo Quickload para a criação do próximo nível. Quando houver apenas um ponteiro nesta lista, a execução do algoritmo chegou ao fim, ou seja, existe apenas o ponteiro para o nó raiz da estrutura.

Esses dois algoritmos não garantem a ocupação mínima do nó e, por essa razão, constróem estruturas com um desempenho muito menor em relação à estrutura construída com uma inserção seqüencial. Além disso, não é levado em consideração o custo de cálculos de distâncias. Dessa forma, não é viável a implementação desses algoritmos em SGBD.

O próximo capítulo irá mostrar como solucionar esses problemas utilizando o conhecimento do conjunto de dados e, a partir daí, calculando as propriedades da estrutura a ser construinda pela operação de carga-rápida.

3 Carga-rápida em Métodos de Acesso Métricos

A maioria dos MAM visa reduzir o número de acessos a disco e cálculos de distâncias em suas operações de buscas e inserções. Para isso, se faz necessário o conhecimento dos dados e suas características intrínsecas. Na inserção elemento a elemento, não há como ter esse conhecimento, sendo que otimizações, como o Slim-down só são feitas quando já existe uma boa quantidade de dados. Na carga-rápida, como todos os dados já são conhecidos, pode-se ter uma análise prévia das

características do conjunto, inserindo blocos de dados na estrutura de maneira otimizada, melhorando a distribuição dos elementos para uma redução do tempo de consulta.

Neste capítulo são apresentadas as características e o funcionamento dos algoritmos de carga-rápida desenvolvidos para o MAM Slim-Tree. Na primeira parte é apresentado o conceito dos algoritmos desenvolvidos e a seguir é feita a descrição das três abordagens utilizadas: Nós de Tamanho Fixo, Nós de Tamanho Fixo por Nível e Nós de Tamanho Controlado.

3.1 Conceito dos Algoritmos

O algoritmo inicial proposto constrói a estrutura de índices de cima para baixo, utilizando a técnica de amostragem. Entretanto, diferentemente do algoritmo de carga-rápida da M-tree, a estrura é construída e mantida balanceada desde o começo do algoritmo, limitando o número de elementos associados à cada amostra obtida.

Para isso, a idéia principal é considerar que uma árvore pode ser descrita pelo número de nós, número de elementos por nó e lista de elementos em cada nó. Os algoritmos existentes na literatura trabalham com os dados para produzir a lista de elementos em cada nó, obtendo os outros dados como conseqüência dessas listas.

A proposta deste algoritmo é estimar o número de nós na árvore e o número de elementos em cada nó antes de associar a sua respectiva lista. Dessa forma, a estrutura é mantida balanceada em todas as etapas do algoritmo, distribuindo os elementos nesses nós de acordo com os valores obtidos (Vespa et al., 2007).

Por essa razão, o primeiro passo do algoritmo é determinar o número de nós que irão compor a estrutura final. Os parâmetros utilizados nesse passo do algoritmo são o número N de elementos a serem indexados, a capacidade máxima CM dos nós e a capacidade mínima Cm

a ser garantida. Para chegar nessa solução, foram utilizadas três abordagens: nós fixos em toda árvore, nós fixos por nível e nós de tamanho controlado.

3.2 Carga-Rápida com Nós de Tamanho Fixo

A idéia principal da abordagem de nós de tamanho fixo é construir toda a estrutura partindo do topo até o seus nós folha (abordagem top-down) utilizando a mesma quantidade de elementos para todos os nós que irão compor a estrutura final. A primeira etapa do algoritmo é escolher como amostra inicial um número fixo de elementos que irão compor o nó pai. Na segunda etapa, para cada nó filho escolhe-se o mesmo número de elementos, sempre respeitando a proximidade em relação a todos os elementos da amostra. Isso é feito até não se ter

(7)

mais elementos a inserir, sendo que na última etapa serão construídos os nós folha, dividindo igualmente o número de elementos por nó. Ao manter fixo o número de elementos por nó, a estrutura criada será mantida balanceada desde o começo do algoritmo e sempre com a taxa de ocupação desejada.

Esse algoritmo de carga-rápida (algoritmo FS) inicia-se com a construção de uma estrutura vazia e passando como argumento uma referência para o conjunto de dados (I), um valor nulo como representante e a capacidade máxima do nó a ser considerada. Se o número de elementos do conjunto for menor que a capacidade máxima, então todos os elementos são inseridos em um único nó. Se o representante é nulo, então a raíz da árvore é criada. Caso o número de elementos a ser inserido seja maior que CM, são escolhidas CM amostras do conjunto

inicial que serão associadas a conjuntos. A partir daí, todos os elementos do conjunto I são distribuídos nos conjuntos associados aos representantes que possuem distância mínima em relação ao representante. Se o conjunto chegar em sua capacidade máxima então ele é inserido em um conjunto K. Se o elemento for associado a uma amostra que possua um conjunto cheio, então ele será inserido nessa amostra e o elemento mais distante em relação a amostra associada será removido desse conjunto e inserido em outro. Isso é feito até que esse elemento mais distante seja inserido em um conjunto que não esteja cheio. A seguir, as amostras são inseridas em um nó e seu representante é criado. Os conjuntos que não estavam cheios serão inseridos no conjunto K sendo que o processamento será feito recursivamente utilizando esse conjunto para que todas as outras sub-árvores sejam criadas. O algoritmo detalhado pode ser encontrado em (Vespa et al., 2007).

O grande problema dessa abordagem é que a construção partindo de cima e com o número de elementos fixo por nó tende a produzir árvores com muitos nós-folha. Para ilustrar o problema, suponha que seja necessário inserir N = 101 elementos em uma árvore com CM = 10 elementos por nó (Figura 2). De forma

top-down, no primeiro passo do algorimto serão atribuídos 10

elementos ao nó raíz. O segundo nível terá 10 nós com 10 elementos cada e o teceiro nível terá 99 nós folhas com um elemento cada e um nó folha com 2 elementos. A árvore será construída com 111 nós e muito espaço livre nos nós folha, mas nenhum espaço livre nos nós internos.

Se fosse possível obter a mesma abordagem seguindo a construção bottom-up, o algoritmo iria produzir um árvore com apenas 11 nós folhas: 2 nós com 10 elementos e 9 nós com 9 elementos. O segundo nível teria 2 nós: um com 5 e outro com 6 elementos e a raíz

teria apenas 2 elementos. A árvore construída de baixo para cima teria apenas 14 nós, melhorando o aproveitamento de disco e o número de acessos necessários ao executar consultas nessas árvores. Essas duas alternativas são mostradas na Figura 2.

Apesar do baixo número de nós, a estrutura construída de baixo para cima não garante um bom desempenho e nem baixo número de cálculos de distância nas consultas, pois não há como prever a construção dos níveis superiores com bom agrupamento dos dados. Na maneira top-down, o agrupamento dos dados é sempre realizado, pois são primeiro escolhidos os representantes para construção dos nós inferiores, mas isso não ocorre na construção bottom-up. Por essa razão, os próximos algoritmos que foram desenvolvidos constrõem a estrutura partindo de cima, mas escolhendo representantes para agrupar os elementos.

3.3 Carga-Rápida com Nós de Tamanho Fixo por Nível

A segunda abordagem segue as mesmas etapas da abordagem anterior, mas diferentemente, esse algoritmo fixa o número de elementos em cada nó considerando cada nível na árvore e não um número fixo para todos os nós. Para tentar obter o mesmo desempenho de acesso a disco da construção bottom-up descrito anteriormente e com o conhecimento de quantos elementos por nível se tem nessa construção, pode-se determinar o número de Figura 2: Carga-Rápida com Nós de Tamanho Fixo com

N = 101 elementos a serem inseridos e com taxa da

ocupação CM = 10. Em (a) a estrutura é construída de cima

para baixo e possui 111 nós. Em (b) a estrutura é construída de baixo para cima e possui apenas 14 nós e com o mesmo número de elementos contidos na estrura descrita em (a).

(8)

elementos que deve-se ter para um bom aproveitamento do disco.

Esse algoritmo descobre o número ideal de elementos por nó em cada nível, para se ter um melhor aproveitamento do espaço em memória secundária. Para isso, ele obtém o número de nós em cada nível e distribui igualmente os elementos nesses nós.

O número de nós em cada nível é calculado como

k = ceil(N/(CM)H-l), onde H é a altura da árvore obtida por

H = ceil(logCMN) e l é o nível da árvore.

Conseqüentemente, o número de elementos em cada nó por nível é dado por: φ = ||I||/k, onde ||I|| é o total de elementos a serem inseridos em cada passo do algoritmo.

O algoritmo de carga-rápida com nós de tamanho fixo por nível (algoritmo LFS) inicia-se da mesma forma que o algoritmo FS. Na primeira etapa do algoritmo, se o número de elementos do conjunto for menor que a capacidade máxima todos os elementos são inseridos em um único nó. Se o representante é nulo a raíz da árvore é criada. Caso o número de elementos a ser inserido seja maior que CM, são escolhidas k = ceil(N/(CM)H-l) amostras

do conjunto inicial. A partir daí, todos os elementos do conjunto I são distribuídos nos conjuntos associados à amostras levando em consideração a proximidade entre os elementos. Se o conjunto chegar em sua capacidade máxima considerando o número de elementos por nível então ele é inserido no conjunto K. É importante observar que essa abordagem leva a um melhor aproveitamento do espaço em disco, pois o algoritmo leva em consideração o número de elementos necessários para se obter o melhor aproveitamento do espaço.

Após essa atribuição, se o elemento for associado a uma amostra que possua um conjunto cheio, ele será inserido nessa amostra e o elemento mais distante em relação a amostra associada será removido desse conjunto e inserido em outro. Isso é feito até que esse elemento mais distante seja inserido em um conjunto que não esteja cheio. A seguir, as amostras são inseridas em um nó e seu representante é criado. Os conjuntos que não estavam cheios serão inseridos no conjunto K, sendo que o processamento será feito recursivamente para que todas as outras sub-árvores sejam criadas, da mesma maneira que o algoritmo anterior. O algoritmo detalhado pode ser encontrado em (Vespa et al., 2007).

Apesar dessa abordagem levar a um bom aproveitamento de espaço em disco e a um pequeno número de nós, ela pode produzir uma ávore com alta sobreposição, pois, a construção é feita de maneira

top-down, embora, com o mesmo número de elementos da

construção bottom-up. O número de elementos em cada

nó está sendo fixado e, por essa razão não são consideradas as propriedades de agrupamento e distribuição de dados como um todo. Nessa abordagem, os elementos em regiões mais densas terão a mesma construção que os elementos em regiões esparsas.

3.4 Carga-Rápida com Nós de Tamanho Controlado

As duas abordagens anteriores não levam em conta a distribuição dos dados. A terceira abordagem tenta acompanhar a distribuição dos dados no espaço, agrupando mais elementos em regiões mais densas e menos em regiões esparsas, utilizando um limite controlado para definir o número de elementos necessários para manter a árvore balanceada. A estrutura é construída sempre encontrando os elementos mais próximos de cada amostra. Uma boa escolha de amostras pode levar a um melhor agrupamento dos elementos, melhorando o desempenho da estrutura.

Essa abordagem usa a proximidade definida entre os elementos para definir o número de elementos por nó, sempre considerando o limite controlado para construir uma árvore balanceada. O limite controlado é obtido pelo número mínimo e máximo de elementos para manter a árvore com altura H = ceil(logCMN). Para isso são

utilizados dois algoritmos: balancedMax e balancedMin. Os algoritmos balancedMin e balancedMax irão retornar falso se os números de elementos em um conjunto irão construir uma árvore balanceada e, verdadeiro caso contrário. Esses dois algoritmos funcionam como um limite para os números de elementos a serem inseridos em cada conjunto associado com uma amostra. Esses números podem ser obtidos da seguinte maneira: determina-se a altura máxima/mínima da sub-árvore que pode armazenar o número de elementos dado. A seguir, a altura obtida é comparada com a altura desejada. Com essa informação, pode-se controlar o número de elementos máximo e mínimo de um nó para construir uma estrutura balanceada.

O algoritmo de carga rápida com nós de tamanho controlado utiliza essas duas funções e pode ser dividido em três etapas: amostragem, atribuição e refinamento.

● A etapa de amostragem inicia o algoritmo

escolhendo amostras (Figura 3).

● A etapa de atribuição utiliza o algoritmo

balancedMax e a proximidade entre cada

elemento do conjunto e as amostras para criar conjuntos associados a cada amostra (Figura 3(b)).

(9)

● A etapa de refinamento re-associa os elementos

que não passam no critério definido pelo algoritmo balancedMin (Figura 3(c))

O método de carga-rápida proposto constrói uma estrutura balanceada de cima para baixo e não fixa o número de elementos por nó, utilizando uma função de distância e um limite para agrupar e determinar o número de elementos por conjunto em cada passo do algoritmo.

O algoritmo de carga-rápida inicia com a criação de uma árvore vazia e com os seguintes argumentos: conjunto a ser carregado (I) e a ocupação máxima (CM) e

mínima (Cm) dos nós. A seguir, o algoritmo seleciona

randomicamente CM elementos (amostras) do conjunto

como representativos - fase de amostragem. Depois todo o conjunto é particionando e é associado um sub-conjunto dos dados a cada representante. Cada elemento é associado ao seu representante mais próximo, respeitando a ocupação mínima do nó para manter a árvore balanceada

- fase de atribuição. Se um subconjunto não tem a quantidade mínima de elementos para manter a árvore balanceada, ele é descartado e seus elementos são re-inseridos em outros subconjuntos, sempre mantendo a árvore balanceada e considerando a distância entre os elementos e os representantes - fase de refinamento. A seguir, um nó com os representantes é criado e atribuído um representante para esse nó. Então, o processo pode ser repetido, construindo a árvore de maneira recursiva. O algoritmo detalhado pode ser encontrado em (Vespa et al., 2007).

Os três algoritmos apresentados constróem estruturas balanceadas, a diferença principal se encontra na distribuição dos elementos nos nós da estrutura. Tanto o primeiro (Carga-Rápida com Nós de Tamanho Fixo), quanto o segundo algoritmo (Carga-Rápida com Nós de Tamanho Fixo por Nível) mantêm uma estrutura rígida fixando o número de elementos por nó, o algoritmo de Carga-Rápida com Nós de Tamanho Controlado tenta utilizar a distribuição dos dados no espaço para otimizar a estrutura, sem perder o balanceamento.

4 Experimentos e Resultados

Nesta seção são mostrados experimentos realizados e os conjuntos e métodos utilizados para a realização desses experimentos e são discutidos os resultados obtidos. Para comparação com o método desenvolvido, utilizando a abordagem mais eficiente: nós de tamanho controlado, foi utilizado o algoritmo da M-tree, que é o único algoritmo de carga-rápida baseado em amostragem específico para dados métricos encontrado na literatura. Além disso, foi feita uma comparação da carga-rápida dos dados com a inserção elemento a elemento.

O processo de experimentação envolve medir o desempenho em testes práticos, comparando os algoritmos desenvolvidos com o de melhor desempenho encontrado na literatura. Os dados avaliados são os mais comuns e que expressam de maneira mais coerente o desempenho do algoritmo. Esses dados são: o tempo total de consulta, o número de cálculos de distância e o número de acessos a disco.

4.1 Conjunto de Dados Utilizados e Métodos

Para avaliar o desempenho dos algoritmos de forma justa, foram escolhidos dados reais e sintéticos com dimensionalidades variadas. A Tabela 1 apresenta os conjuntos de dados utilizados na avaliação de desempenho, indicando seus nomes, números de elementos (#Elem), dimensionalidade de imersão (D), o tamanho da página (Pg), a métrica utilizada (d()) e uma Figura 3: As três etapas do algoritmo de carga-rápida: (a)

a etapa de amostragem escolhe CM amostras; (b) a etapa

de atribuição divide os elementos considerando a função

balancedMax como o limite máximo (Max) para o

número de elementos; (c) a etapa de refinamento atribui novamente os elementos (d) considerando um limite mínimo (Min) utilizando a função balancedMin.

(10)

breve descrição de cada conjunto. A capacidade máxima do nó CM é obtida pelo tamanho do elemento armazenado

pelo tamanho da página utilizada.

Nome #Elem D Pg d() Descrição Cities 5.507 2 1KB L2 Coordenadas

geográficas das cidades do Brasil (www.ibge.gov.br) Eigenfaces 11.900 16 4KB L2 Projeto Informedia

da Carnegie Mellon University (Wactlar et al., 1996) MedHisto 4.247 - 4KB LM Histogramas métricos de níveis de cinza de imagens médicas. Conjunto gerado no GBDI, ICMC, USP (Traina et al., 2002)

Synt256D 10.000 256 10KB L2 Vetores de dados

sintéticos com distribuição Gaussiana contendo 100 agrupamentos em um hipercubo com dimensão 256. O procedimento para gerar este conjunto se encontra descrito em (Ciaccia et al., 1997)

Tabela 1: Conjunto de dados utilizados nos experimentos. Os experimentos foram executados em um computador com processador Intel Pentium 4 HT 3.0 Ghz, com 2GB de memória RAM e 160GB de espaço em disco. O algoritmo proposto foi implementado na biblioteca Arboretum utilizando a linguagem de programação C++. Em cada teste foi escolhido como algoritmo de divisão de nós o minMax e como algotitmo chooseSubtree de escolha de sub-árvore o algoritmo minDist. Foi utilizada a taxa de ocupação de 25% como taxa de ocupação mínima Cm,

tanto na Slim-tree quanto na M-tree. Para a Slim-tree foi

executado o algoritmo Slim-Down e os resultados medidos após sua execução.

4.2 Tempo de Construção

Comparando a inserção seqüencial com a operação de carga-rápida na Slim-tree (Tabela 2), o tempo total para inserir 5.257 cidades no conjunto Cities utilizando o algoritmo de carga-rápida, foi 6,3 vezes mais rápido que a inserção seqüencial. Para os conjuntos Eigenfaces, MedHisto and Synth256D, a operação de carga-rápida foi, respectivamente, 4,88, 3,55 e 1,96 vezes mais rápida, em relação à inserção seqüencial.

Considerando o número de acessos a disco, o algoritmo de carga-rápida requer 44 vezes menos acessos a disco no conjunto Cities, 22,81, 5,22 e 3,38 vezes menos acesso a disco nos conjuntos Eigenfaces, MedHisto e Synth256D. Realizando a carga-rápida nesses mesmos conjuntos, é necessário, 6,1, 3,63, 1,8 e 1,79 vezes menos cálculos de distância, respectivamente, comparado com a inserção seqüêncial. Conj. De Dados Tempo Total (segundos) Núm. Ac. Disco Núm. Calc. Distâncias Cities 0,593 36.524 206.683 Cities Carga Rápida 0,094 830 33.852 Eigenfaces 25,703 96.646 1.594.920 Eigenfaces Carga Rápida 5,265 4.236 439.134 MedHisto 47,659 79.140 2.845.373 MedHisto Carga Rápida 13,419 15.153 1.511.716 Synt256D 55,978 99.446 4.463.498 Synt256D Carga Rápida 28,563 29.446 2.487.495 Tabela 2: Desempenho da inserção. Comparativo entre inserção seqüêncial e a operação de carga-rápida na

Slim-tree.

Como demonstrado, o desempenho nas operações de inserção utilizando o algoritmo de carga-rápida é melhor em relação ao da inserção seqüêncial. De fato, a operação de carga-rápida pode ser 44 vezes mais eficiente na construção em relação à inserção seqüencial. Com isso,

(11)

para todos os casos analisados, o algoritmo de carga-rápida se mostrou superior e mais rápido que a inserção seqüencial e com menor número de acesso a disco e cálculos de distância. A Tabela 2 mostra as medidas obtidas.

4.3 Desempenho em Consultas

Para medir o desempenho em consultas, foi preparado um conjunto com 500 elementos para serem utilizados como centro das consultas. Esses elementos foram escolhidos aleatoriamente do conjunto de dados inicial e 250 deles foram removidos do conjunto original antes da inserção. Portanto, metade dos conjuntos de consultas foram indexados e a outra metade não. Para cada medida no gráfico, foram calculados o número médio de acessos a disco, o número médio de cálculos de distância e o tempo total de processamento em segundos para executar as 500 consultas variando o raio ou o número de elementos k considerando os 500 centros de consultas.

A Figura 4 mostra o resultado das consultas aos

k-vizinhos mais próximos realizadas sobre os conjuntos

Cities, MedHisto e Synth256D. Como é possível notar, a utilização do método de carga-rápida reduz em mais de 41% o número de acessos a disco quando comparado com a inserção seqüencial na Slim-tree e reduz em 28% quando comparado com o algoritmo de carga-rápida para a M-tree.

Além disso, o algoritmo de carga-rápida para a

Slim-tree requer 34% menos cálculos de distâncias

(Figura 5) e é 41% mais rápido considerando o tempo de processamento (Figura 6) em relação à inserção sequëncial e utiliza 24% menos cálculos de distância sendo 26% mais rápido que o algoritmo desenvolvido para a M-tree.

Em consultas por abrangência, quando são utilizados raios pequenos em relação ao conjunto, o algoritmo de carga-rápida para a Slim-tree possui desempenho similar à inserção seqüencial e ao algoritmo da M-tree. Entretanto, ao aumentar o raio da consulta, o desempenho do algoritmo de carga-rápida da Slim-tree melhora em relação aos outros algoritmos. Com um raio de 32% do diâmetro do conjunto, o algoritmo da Slim-tree utiliza 26% menos acessos a disco (Figura 7), 13% menos cálculos de distância (Figura 8) e é 11% mais rápido comparado com a inserção seqüêncial.

Comparando os dois algoritmos de carga-rápida, o algoritmo da Slim-tree utiliza 32% menos acessos a disco, 15% menos cálculos de distância e é 15% mais rápido que o algoritmo da M-tree.

Os resultados demonstraram que o algoritmo de carga-rápida proposto para a Slim-tree é seis vezes mais rápido que a construção seqüencial chegando a melhorar em até 41% o número de acessos a disco, 34% menos Figura 4: Resultado das consultas aos k-vizinhos mais

próximos, comparando o número médio de acessos a disco para 500 consultas após a realização da inserção seqüêncial e carga-rápida para M-tree e a Slim-Tree utilizando os conjuntos Cities, MedHisto e Synth256D.

Figura 5: Resultado das consultas aos k-vizinhos mais próximos, comparando o número médio de cálculos de distância para 500 consultas após a realização da inserção seqüêncial e carga-rápida para M-tree e a Slim-Tree utilizando os conjuntos Cities, MedHisto e Synth256D.

Figura 6: Resultado das consultas aos k-vizinhos mais próximos, comparando o tempo total para realizar 500 consultas após a a inserção seqüêncial e carga-rápida para

M-tree e a Slim-Tree utilizando os conjuntos Cities,

(12)

cálculos de distância e 41% no tempo de acesso em relação a inserção seqüêncial.

Em comparação com o algoritmo da M-tree, o algoritmo proposto superou o desempenho em todos os experimentos, considernado o tempo de consulta, número de acesso disco e tempo para executar as operações, tanto em consultas aos k-vizinhos mais próximos quanto por abrangência.

5 Conclusões

Nesse trabalho, foram proposta três técnicas para carga-rápida dos dados para MAM e foram mostrado três algoritmos baseados nessas técnicas para construir uma

Slim-tree. Esses são os primeiros algoritmos de

carga-rápida baseada em amostragem para MAM hierárquicos dinâmicos e que sempre produzem um MAM válido, como demonstrado para o MAM Slim-tree. Portanto esses são os primeiros algoritmos de carga-rápida descritos na literatura que podem ser incluído em um SGBD.

Os experimentos mostraram que o algoritmo proposto utilizando nós de tamanho controlado mantém boa clusterização dos dados e supera o desempenho dos métodos de inserção sequencial considerando tanto construção quanto desempenho nas consultas.

5.1 Principais Contribuições deste Trabalho

As principais contribuições deste trabalho são:

● Análise de três abordagens utilizando

amostragem dos dados para construção de MAM hierárquicos: Nós de Tamanho Fixo; Nós de Tamanho Fixo por Nível; Nós de Tamanho Controlado.

● Desenvolvimento de técnicas de carga rápida para métodos de acesso métricos hierárquicos e dinâmicos. A partir dessas técnicas, foram desenvolvidos algoritmos de carga-rápida para a

Slim-tree. Estes são os únicos algoritmos para a Slim-tree baseados em amostragem que sempre

geram uma estrutura válida, pois os algoritmos manteêm a estrutura balanceada desde a sua etapa inicial.

● Estudo comparativo utilizando experimentos

entre os métodos de inserção: elemento a elemento e carga-rápida, mostrando que a operação de carga-rápida é mais eficiente tanto na construção, quanto no desempenho das consultas.

● Estudo comparativo utilizando experimentos entre a operação de carga-rápida da M-tree e da

Slim-tree. Com esse estudo, podemos demonstrar

a superioridade do algoritmo com nós de Figura 7: Resultado das consultas por abrangência,

comparando o número médio de acessos a disco para 500 consultas após a realização da inserção seqüêncial e carga-rápida para M-tree e a Slim-Tree utilizando os conjuntos EigenFaces e Synth256D.

Figura 8: Resultado das consultas por abrangência, comparando o número médio de cálculos de distância para 500 consultas após a realização da inserção seqüêncial e carga-rápida para M-tree e a Slim-Tree utilizando os conjuntos EigenFaces e Synth256D.

Figura 9: Resultado das consultas por abrangência, comparando o tempo total para realizar 500 consultas após a a inserção seqüêncial e carga-rápida para M-tree e a

Slim-Tree utilizando os conjuntos EigenFaces e

(13)

tamanho controlado, tanto no tempo de inserção, quanto ao realizar consultas.

5.2 Propostas para Trabalhos Futuros

As propostas de trabalhos futuros para esse trabalho são:

● Identificação dos casos na qual a técnica de carga-rápida com Nós de Tamanho Controlado pode ser melhorada e desenvolvimento de um algoritmo para melhorá-la.

● Desenvolvimento de um método para verificar se

as amostras obtidas são os centros de seus conjunto associado e mudá-las se necessário.

● Criação e implementação de algoritmos para utilizar técnicas de clusterização para escolher as melhores amostras ao realizar a carga-rápida na estrutura.

References

Arge, L. (2003). The buer tree: A technique for designing batched external data structures. Algorithmica, 37(1):1-24. Arge, L., Hinrichs, K., Vahrenhold, J., e Vitter, J. S. (2002). Eficient bulk operations on dynamic r-trees. Algorithmica, 33(1):104-128.

Bercken, J. V. d. e Seeger, B. (2001). An evaluation of generic bulk loading techniques. International Conference on Very Large Databases (VLDB), p. 461-470.

Berchtold, S., B ohm, C., e Kriegel, H.-P. (1998b). The pyramid-technique: Towards breaking the curse of dimensionality. In Haas, L. M. e Tiwary, A., editors, SIGMOD 1998, Proceedings ACM SIGMOD International Conference on Management of Data, June 2-4, 1998, Seattle, Washington, USA, p. 142-153. ACM Press.

Chong, E. I., Das, S. Freiwald, C., Srinivasan, J., Yalamanchi, A., Jagannath, M., Tran, A.-T., e Krishnan, R. (2001). B+-tree indexes with hybrid row identiers in oracle8i. IEEE International Conference on Data Engineering (ICDE), p. 341-348.

Ciaccia, P. e Patella, M. (1998). Bulk loading the m-tree. Proceedings of the 9th Australasian Database Conference (ADC 98), p. 15-26.

Ciaccia, P., Patella, M., e Zezula, P. (1997). M-tree: An efficient access method for similarity search in metric spaces. Proceedings of 23rd International Conference on Very Large Data Bases (VLDB), p. 426-435.

Comer, D. (1979). The ubiquitous b-tree. ACM Computing Surveys, 11(2):121-137.

Faloutsos, C. (1996). Searching Multimedia Databases by Content. Kluwer Academic Publishers, Boston, USA. Faloutsos, C. (1997). Indexing of multimedia data. In Multimedia Databases in Perspective, p. 219-245. Springer.

Faloutsos, C. e Roseman, S. (1989). Fractals for secondary key retrieval. In PODS '89: Proceedings of the eighth ACM SIGACT-SIGMODSIGART symposium on Principles of database systems, p. 247-252, New York, NY, USA. ACM Press.

Gaede, V. e Günther, O. (1998). Multidimensional access methods. ACM Computing Surveys, 30(2):170- 231. Ghanem, T. M., Shah, R., Mokbel, M. F., Aref, W. G., e Vitter, J. S. (2004). Bulk operations for space-partitioning trees. In ICDE '04: Proceedings of the 20th International Conference on Data Engineering, page 29, Washington, DC, USA. IEEE Computer Society.

Johnson, T. e Shasha, D. (1989). Utilization of b-trees with inserts, deletes and modifies. In PODS '89: Proceedings of the eighth ACM SIGACTSIGMOD-SIGART symposium on Principles of database systems, p. 235-246, New York, NY, USA. ACM Press.

Johnson, T. e Shasha, D. (1993a). B-trees with inserts and deletes: Why free-at-empty is better than merge-at-half. Journal of Computer and System Sciences, 47(1):45-76. Johnson, T. e Shasha, D. (1993b). The performance of current b-tree algorithms. ACM Transactions on Database Systems (TODS), 18(1):51-101.

Lang, C. A. e Singh, A. K. (2001). Modeling high-dimensional index structures using sampling. SIGMOD Record (ACM Special Interest Group on Management of Data), 30(2):389-400.

Lin, B. e Su, J. (2004). On bulk loading tpr-tree. IEEE International Conference on Mobile Data Management (MDM'04), p. 114-124.

Lomet, D. B. (2001). The evolution of effective b-tree: Page organization and techniques: A personal account. SIGMOD Record, 30(3):64-69.

Melton, J., Michels, J.-E., Josifovski, V., Kulkarni, K. G., e Schwarz, P. M. (2002). Sql/med - a status report. ACM SIGMOD Records, 31(3):81-89.

Traina, A. J. M., Traina Jr, C., Bueno, J. M., e Marques, P. M. A. (2002). The metric histogram: A new and efficient approach for content-based image retrieval. IFIP Working Conference on Visual Database Systems (VDB).

[Traina Jr. et al., 2000] Traina Jr., C., Traina, A. J. M., Seeger, B., e Faloutsos, C. (2000). Slim-trees: High performance metric trees minimizing overlap between

(14)

nodes. International Conference on Extending Database Technology, v. 1777 of Lecture Notes in Computer Science, p. 51-65.

Vespa, T. G., Traina Jr., C., e Traina, A. J. M. (2007). Bulkloading dynamic metric access methods. XXII Simpósio Brasileiro de Banco de Dados (SBBD'2007). Vitter, J. S. (1998). External memory algorithms. In Proceedings of the Seventeenth ACM SIGACT-SIGMOD-SIGART Symposium on Principles of Database Systems, June 1-3, 1998, Seattle, Washington, p. 119-128. ACM Press.

Wactlar, H. D., Kanade, T., Smith, M. A., e Stevens, S. M. (1996). Intelligent access to digital video: Informedia project. Computer, 29(3):46-52.

Referências

Documentos relacionados

Caso a busca tenha que continuar, podemos proceder exatamente da mesma maneira: verificamos o item existente no meio da metade escolhida e se ele ainda não for aquele que

Elateridae representa um grande grupo da ordem Coleoptera, tendo várias espécies muito comuns (borror &amp; D elong 1969). A presença de famílias de hábitos variados,

Dentre as características avaliadas, as que mais contribuíram para a distinção entre os acessos pertencentes ao BGH/UFV foram: número máximo de folhas por planta, margem da

Tendo identificado e caracterizado as concepções de álgebra mais utilizadas no meio educacional, faremos um paralelo entre elas e as concepções de ensino de álgebra, que constituem

VISTOS, RELATADOS E DISCUTIDOS OS PRESENTES AUTOS, ACORDAM OS MEMBROS DA CÂMARA CRIMINAL DO TRIBUNAL DE JUSTIÇA DE SERGIPE, SOB A PRESIDÊNCIA DA EXCELENTÍSSIMA

Os projetos, componentes de um programa, podem ser definidos como um conjunto de componentes de um programa, podem ser definidos como um conjunto de atividades

„ Estudo de novas técnicas de linearização capazes de reverter as componentes de distorção na presença de efeitos

Nos estudos científicos em educação, vários métodos de pesquisa estão em pleno desenvolvimento na atualidade e, entre elas, os mais diversos tipos de observação, o que permite