15.07.2013 Views

ISCTE – ESCOLA DE GESTÃO - Universidade Técnica de Lisboa

ISCTE – ESCOLA DE GESTÃO - Universidade Técnica de Lisboa

ISCTE – ESCOLA DE GESTÃO - Universidade Técnica de Lisboa

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

tenha sido percorrido. Se o array estivesse armazenado sob a forma <strong>de</strong> vários chunks, a computação <strong>de</strong><br />

AB seria feita não percorrendo um plano completo <strong>de</strong> dimensão |A||B|, em que |A| e |B| são<br />

respectivamente o tamanho da dimensão A e B, isso seria feito chunk a chunk. Supondo que a dimensão<br />

A num chunk tem tamanho AC e que a dimensão B num chunk tem tamanho BC e que o array é orientado<br />

<strong>de</strong> tal forma que a face AB do array está <strong>de</strong> frente para o leitor, o chunk po<strong>de</strong> ter início na parte superior<br />

esquerda do array e percorrer um plano <strong>de</strong> dimensão ACBC, agregando todos os valores <strong>de</strong> C no<br />

processo. Depois <strong>de</strong> percorrido este chunk na porção superior esquerda, o varrimento <strong>de</strong>ste plano<br />

continua através do chunk imediatamente atrás do que se encontra no topo superior esquerdo e termina<br />

apenas quando o plano foi todo percorrido <strong>de</strong>ntro do array. Neste ponto, a porção do agregado AB<br />

correspon<strong>de</strong>nte ao subplano superior esquerdo <strong>de</strong> dimensão ACBC já foi computada, pelo que este plano<br />

é guardado em disco como a primeira parte do agregado AB e prosseguir com o cálculo do subplano<br />

correspon<strong>de</strong>nte a outro chunk. Desta forma, cada chunk apenas é lido uma vez e no fim <strong>de</strong> serem<br />

percorridos todos os chunks o agregado AB encontrar-se-á em disco como uma colecção <strong>de</strong> planos <strong>de</strong><br />

tamanho ACBC. A memória usada por este processo é a suficiente para conter um chunk e o plano ACBC<br />

à medida que os chunks são varridos [Zhao1997].<br />

Porém, para computar um cubo é necessário computar mais que um agregado do mesmo. Num array<br />

com as dimensões ABC, consi<strong>de</strong>re-se agora que é necessário computar AB, BC, AC, A, B, C e o<br />

agregado total. Uma abordagem ingénua consistiria em computar todos estes agregados a patir do array<br />

inicial ABC. Porém, é muito mais eficiente calcular A a partir <strong>de</strong> AB do que calcular A a partir <strong>de</strong> ABC. Se<br />

se vir a computação do cubo como uma árvore em que ABC é a raiz, AB, BC e AC <strong>de</strong>scen<strong>de</strong>m <strong>de</strong> ABC,<br />

A e C <strong>de</strong>scen<strong>de</strong>m <strong>de</strong> AC e assim sucessivamente. Como as dimensões do array e o tamanho <strong>de</strong> cada<br />

um dos chunks são conhecidos, é possível <strong>de</strong>terminar exactamente o tamanho do array correspon<strong>de</strong>nte<br />

a cada nó da árvore e estimar o espaço necessário para o seu cálculo. Isto significa que é possível<br />

<strong>de</strong>finir a árvore mínima <strong>de</strong> cobertura (minimum spanning tree) em que o pre<strong>de</strong>cessor <strong>de</strong> cada nó n é o<br />

nó n’ <strong>de</strong> menor tamanho a partir do qual n po<strong>de</strong> ser computado. O funcionamento do algoritmo apoia-se<br />

na construção da árvore mínima <strong>de</strong> cobertura para os agregados do cubo que se preten<strong>de</strong> computar.<br />

Cada agregado Di1, Di2, ..., Dik+1 é calculado a partir do pre<strong>de</strong>cessor Di1, Di2, ..., Dik+1 com tamanho<br />

mínimo; cada chunk <strong>de</strong> Di1, Di2, ..., Dik+1 é lido segundo a dimensão Dik+1 e agregado para um chunk <strong>de</strong><br />

Di1, Di2, ..., Dik. Quando o chunk <strong>de</strong> Di1, Di2, ..., Dik estiver completo, é guardado em disco e a memória é<br />

libertada para o chunk seguinte <strong>de</strong> Di1, Di2, ..., Dik [Zhao1997].<br />

O recurso ao chunking assegura a eficiência a nível <strong>de</strong> carregamento e armazenamento dos valores das<br />

células do cubo, enquanto a eficiência a nível <strong>de</strong> <strong>de</strong>sempenho é assegurada pelo uso da or<strong>de</strong>m correcta<br />

no cálculo dos agregados. A or<strong>de</strong>m das dimensões num chunk po<strong>de</strong> ser representada como O = (Dj1, Dj2,<br />

... , Djn), assumindo que existem n dimensões D1, D2, ..., Dn. Diferentes or<strong>de</strong>namentos <strong>de</strong> dimensões<br />

implicam diferentes or<strong>de</strong>ns <strong>de</strong> leitura dos chunks e <strong>de</strong>terminam a quantida<strong>de</strong> <strong>de</strong> memória que é<br />

necessária para efectuar a computação. Para mostrar a importância da or<strong>de</strong>m pela qual são tomadas as<br />

dimensões, consi<strong>de</strong>re-se um array <strong>de</strong> dados 3D com três dimensões (A, B e C), dividido em 64 chunks<br />

31

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!