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
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